home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
mus
/
edit
/
ptsource.lzh
/
PT.LZH
/
PT1.2.asm
< prev
next >
Wrap
Assembly Source File
|
1991-12-18
|
348KB
|
19,805 lines
**********************************************************
* *
* Protracker Version 1.2 - Release A *
* Amiga Freelancers 1991 *
* *
* Based on Soundtracker V2.5 / Noisetracker x.x) *
* Coding by Lars Hamre *
* with some "Resource" help from Anders Hamre *
* Thanks to Rune, and a hi there to Sven, Morten, *
* Per and Torgeir. *
* *
*--------------------------------------------------------*
* First Update 1.0 : 04/05-1990 First version *
* Middle Update 1.0 : 13/08-1990 - *
* Last Update 1.0 : 25/08-1990 - *
* Final Version 1.0 : 26/08-1990 Released to Crusaders *
* Rev. B Update 1 1.0B: 29/08-1990 - *
* Rev. B Update 2 1.0B: 06/09-1990 Released to Crusaders *
* Rev. C Update 1 1.0C: 16/10-1990 - *
* Rev. C Update 2 1.0C: 18/10-1990 - *
* Start V1.1A 1.1A: 23/10-1990 Second version *
* Rev. C Update 3 1.0C: 06/11-1990 Released to Crusaders *
* Rev. A Update 1 1.1A: 15/11-1990 InputEvent Handler *
* Rev. A Update 2 1.1A: 21/11-1990 RunBack Hunk, KbdBuf. *
* Rev. A Update 3 1.1A: 02/12-1990 iffld,loopspr,scopefix*
* Rev. A Update 4 1.1A: 05/12-1990 virusattack,dirbrowse *
* Rev. A Update 5 1.1A: 20/12-1990 Testversion to Awesome*
* Rev. A Update 6 1.1A: 27/12-1990 Party-release (w/bugs)*
* Rev. B Update 1 1.1B: 01/01-1991 Bugfixing... *
* Rev. B Update 2 1.1B: 05/01-1991 --- *
* Rev. B Update 3 1.1B: 08/01-1991 ScopeGfx, loadbug. *
* Start V2.0A 2.0A: 12/02-1991 Wow! a new version... *
* Start V1.2A 1.2A: 13/07-1991 Kick 37.175 version *
**********************************************************
; FileFormat
sd_songname EQU 0
sd_sampleinfo EQU 20
sd_numofpatt EQU 950
sd_pattpos EQU 952
sd_mahokakt EQU 1080
sd_patterndata EQU 1084
; audXtemp offsets
n_note EQU 0 ; W
n_cmd EQU 2 ; W
n_cmdlo EQU 3 ; low B of cmd
n_start EQU 4 ; L
n_length EQU 8 ; W
n_loopstart EQU 10 ; L
n_replen EQU 14 ; W
n_period EQU 16 ; W
n_finetune EQU 18 ; B
n_volume EQU 19 ; B
n_dmabit EQU 20 ; W
n_toneportdirec EQU 22 ; B
n_toneportspeed EQU 23 ; B
n_wantedperiod EQU 24 ; W
n_vibratocmd EQU 26 ; B
n_vibratopos EQU 27 ; B
n_tremolocmd EQU 28 ; B
n_tremolopos EQU 29 ; B
n_wavecontrol EQU 30 ; B
n_glissfunk EQU 31 ; B
n_sampleoffset EQU 32 ; B
n_pattpos EQU 33 ; B
n_loopcount EQU 34 ; B
n_funkoffset EQU 35 ; B
n_wavestart EQU 36 ; L
n_reallength EQU 40 ; W
n_trigger EQU 42 ; B
n_samplenum EQU 43 ; B
; Exec Library Offsets
LVOFindTask EQU -294
LVOFindName EQU -276
LVOForbid EQU -132
LVOPermit EQU -138
LVOAddPort EQU -354
LVORemPort EQU -360
LVOWaitPort EQU -384
LVOOpenLibrary EQU -552
LVOCloseLibrary EQU -414
LVOOpenDevice EQU -444
LVOCloseDevice EQU -450
LVODoIO EQU -456
LVOSendIO EQU -462
LVOGetMsg EQU -372
LVOReplyMsg EQU -378
LVOAllocMem EQU -198
LVOAllocAbs EQU -204
LVOFreeMem EQU -210
LVOAvailMem EQU -216
LVOAddIntServer EQU -168
LVORemIntServer EQU -174
LVOOpenResource EQU -498
LVOSetFunction EQU -420
LVOSetIntVector EQU -162
LVORemDevice EQU -438
; CIA Resource Offsets
AddICRVector EQU -6
RemICRVector EQU -12
; DOS Library Offsets
LVOOpen EQU -30
LVOClose EQU -36
LVORead EQU -42
LVOWrite EQU -48
LVODeleteFile EQU -72
LVORename EQU -78
LVOLock EQU -84
LVOUnLock EQU -90
LVOExamine EQU -102
LVOExNext EQU -108
LVOInfo EQU -114
LVOIoErr EQU -132
LVOSeek EQU -66
LVOCreateDir EQU -120
LVOCurrentDir EQU -126
LVODateStamp EQU -192
LVODelay EQU -198
LVOExecute EQU -222
LVOUnLoadSeg EQU -156
; Intuition Library Offsets
LVOAutoRequest EQU -348
LVODisplayAlert EQU -90
LVOOpenWorkbench EQU -210
LVOCloseWorkbench EQU -78
LVOWBenchToFront EQU -342
; Graphics Library Offsets
LVOBltBitMap EQU -30
LVOWaitBlit EQU -228
LVOOwnBlitter EQU -456
LVODisownBlitter EQU -462
; DateStamp
ofib_DateStamp EQU $84
ds_Days EQU $00
ds_Minute EQU $04
ds_Tick EQU $08
; Memory Alloc Flags
MEMF_PUBLIC EQU $0001
MEMF_CHIP EQU $0002
MEMF_FAST EQU $0004
MEMF_CLEAR EQU $10000
MEMF_LARGEST EQU $20000
; IO Block Offsets
IO_COMMAND EQU $1C
IO_FLAGS EQU $1E
IO_ACTUAL EQU $20
IO_LENGTH EQU $24
IO_DATA EQU $28
IO_OFFSET EQU $2C
; Device Commands
CMD_READ EQU $2
CMD_WRITE EQU $3
CMD_UPDATE EQU $4
TD_MOTOR EQU $9
TD_FORMAT EQU $B
TD_CHANGESTATE EQU $E
TD_PROTSTATUS EQU $F
INCDIR "dh0:devpac/include/"
INCLUDE "exec/execbase.i"
DirNameLength EQU 30
ConfigFileSize EQU 1024
KeyBufSize EQU 20
;**************************************************************************
; RunBack Hunk for Protracker
; Written by Lars Hamre/Amiga Freelancers 1990
; NOTE: This version will not pass arguments or WBMsg to the new Process!
SECTION ptrunback,CODE
rb_HunkStart
SUB.L A1,A1
MOVE.L 4.W,A6
JSR -294(A6) ; FindTask
MOVE.L D0,A4
MOVEQ #0,D0
TST.L $AC(A4) ; pr_CLI
BNE.S rb_FromCLI
LEA $5C(A4),A0 ; pr_MsgPort
JSR -384(A6) ; WaitPort
LEA $5C(A4),A0
JSR -372(A6) ; GetMsg
rb_FromCLI
MOVE.L D0,D7 ; D7 = WBmsg
LEA rb_DOSname(PC),A1
MOVEQ #0,D0
JSR -552(A6) ; OpenLibrary
TST.L D0
BEQ.S rb_dexit
MOVE.L D0,A5
EXG A5,A6 ; A6=DOS
MOVE.L $98(A4),D1 ; pr_CurrentDir
JSR -96(A6) ; DupLock
MOVE.L D0,rb_CurrentDir
EXG A5,A6 ; A6=exec
JSR -132(A6) ; Forbid
MOVE.L #rb_ProgName,D1
MOVEQ.L #0,D2
MOVE.B 9(A4),D2 ; priority
LEA rb_HunkStart-4(PC),A0
MOVE.L (A0),D3 ; Ptr to next segment
CLR.L (A0) ; Unlink next segment
MOVE.L #4000,D4
EXG A5,A6 ; A6=DOS
JSR -138(A6) ; CreateProc
EXG A5,A6 ; A6=exec
JSR -138(A6) ; Permit
MOVE.L A5,A1
JSR -414(A6) ; CloseLibrary
rb_dexit
TST.L D7
BEQ.S rb_exit
JSR -132(A6) ; Forbid
MOVE.L D7,A1
JSR -378(A6) ; ReplyMsg
rb_exit MOVEQ #0,D0
RTS
rb_DOSname dc.b "dos.library",0
; End of runback hunk
;******************** CODE HUNK *********************
SECTION ptcode,CODE
START MOVE.L 4.W,A6
SUB.L A1,A1
JSR LVOFindTask(A6)
MOVE.L D0,PTProcess
BSR.S Main
MOVE.L 4.W,A6
JSR LVOForbid(A6)
MOVE.L DOSbase,A6
MOVE.L rb_CurrentDir(PC),D1
JSR LVOUnLock(A6)
LEA START-4(PC),A0
MOVE.L A0,D1
LSR.L #2,D1
JSR LVOUnLoadSeg(A6)
MOVEQ #0,D0
RTS
Main MOVE.L SP,StackSave
BSR OpenLotsOfThings
BSR SetVBInt
BSR SetMusicInt
BSR SetInputHandler
BSR SetAutoReq
BSR SetPatternPos
BSR SetNormalPtrCol
BSR StorePtrCol
BSR RedrawToggles
BSR DoShowFreeMem
BSR SetTempo
BSR SetCopList
BSR CheckInitError
LEA VersionText(PC),A0
JSR ShowStatusText
MainLoop
BSR DoKeyBuffer
BSR CheckTransKeys
BSR CheckCtrlKeys
BSR CheckAltKeys
BSR CheckKeyboard
BSR CheckF1_F2
BSR CheckF3_F5
BSR CheckF6_F10
BSR CheckPlayKeys
BSR CheckHelpKey
BSR ArrowKeys2
BSR ShowTimer
BSR ShowFreeMem
BSR CheckBlockPos
BSR CheckSampleLength
BSR CheckRedraw
JSR CheckMIDIin
BTST #6,$BFE001
BNE.S MainLoop ; Loop if not pressed
TST.W CurrScreen
BNE.S MainSkip
MOVE.W #1,notogfl
BSR DisplayMainScreen
JSR ShowAllRight
BSR WaitForButtonUp
MainSkip
BSR ArrowKeys
BRA CheckGadgets
notogfl dc.w 0
PTProcess dc.l 0
rb_CurrentDir dc.l 0
rb_Progname dc.b "PT1.2A",0
VersionText dc.b 'V1.2 - RELEASE A',0
CheckInitError
MOVE.B InitError,D0
BEQ Return1
BTST #0,D0
BEQ.S cieskp1
JSR PLSTMemErr
cieskp1 MOVE.B InitError,D0
BTST #1,D0
BEQ.S cieskp2
JSR PLSTOpenErr
JSR FreePLST
cieskp2 MOVE.B InitError,D0
BTST #2,D0
BEQ.S cieskp3
BSR ConfigErr
cieskp3 MOVE.B InitError,D0
BTST #3,D0
BEQ Return1
BSR ConfigErr2
BSR SetNormalPtrCol
BRA StorePtrCol
CheckRedraw
TST.B UpdateTempo
BEQ.S chkredr
CLR.B UpdateTempo
BSR SetTempo
chkredr CMP.L #'patp',RunMode
BNE Return1
JSR ShowPosition
TST.B PattRfsh
BEQ Return1
MOVE.L PattRfshNum,PatternNumber
JMP RedrawPattern
;---- Cleanup upon exit from PT ----
ExitCleanup
JSR StopIt
SF EdEnable
BSR EscPressed
BSR EscPressed
BSR ResetVBInt
BSR ResetMusicInt
BSR ResetInputHandler
BSR ResetAutoReq
BSR ResetCopList
JSR CloseMIDI
JSR FreeCopyBuf
errorexit1
errorexit2
MOVE.L StackSave,SP
MOVE.L 4.W,A6
MOVE.L GfxBase,A1
JSR LVOCloseLibrary(A6)
MOVE.L IntuitionBase,A1
JSR LVOCloseLibrary(A6)
MOVE.L DOSbase,A1
JSR LVOCloseLibrary(A6)
MOVE.L TextBplPtr,D1
BEQ.S exex1
MOVE.L D1,A1
MOVE.L #27760,D0
JSR LVOFreeMem(A6)
exex1 MOVE.L SongDataPtr,D1
BEQ.S exex2
MOVE.L D1,A1
MOVE.L #70716,D0
JSR LVOFreeMem(A6)
exex2 BSR FreeDirMem
BSR GiveBackInstrMem
JSR FreePLST
JSR TurnOffVoices
BCLR #1,$BFE001
MOVE.B LEDStatus,D0
AND.B #2,D0
OR.B D0,$BFE001 ; Restore LED Status
MOVEQ #0,D0
Return1 RTS
;---- Open Lots Of Things ----
OpenLotsOfThings
MOVE.B $BFE001,LEDStatus
BSET #1,$BFE001
JSR TurnOffVoices
MOVE.L 4.W,A6
LEA DOSname(PC),A1 ; Open DOS library
MOVEQ #0,D0
JSR LVOOpenLibrary(A6)
MOVE.L D0,DOSbase
LEA GraphicsName(PC),A1 ; Open graphics library
MOVEQ #0,D0
JSR LVOOpenLibrary(A6)
MOVE.L D0,GfxBase
LEA IntuitionName(PC),A1 ; Open Intuition library
MOVEQ #0,D0
JSR LVOOpenLibrary(A6)
MOVE.L D0,IntuitionBase
MOVE.L DOSbase,A6
MOVE.L rb_CurrentDir(PC),D1
JSR LVOCurrentDir(A6)
MOVE.L #27760,D0 ; Alloc 27k CHIP textbpl
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,TextBplPtr
BEQ errorexit1
MOVE.W D0,NoteBplptrLow ; set low word
SWAP D0
MOVE.W D0,NoteBplptrHigh ; set high word
MOVE.L #70716,D0 ; Alloc 70k patternmemory
MOVE.L #MEMF_PUBLIC!MEMF_CLEAR,D1
JSR LVOAllocMem(A6)
MOVE.L D0,SongDataPtr
BEQ errorexit2
MOVE.L D0,A0
LEA $0014(A0),A0
MOVEQ #30,D0
alotloop1
MOVE.W #1,$001C(A0)
LEA $001E(A0),A0
DBRA D0,alotloop1
MOVE.L SongDataPtr,A0
MOVE.W #$017F,sd_numofpatt(A0)
MOVE.L #'M.K.',sd_mahokakt(A0) ; M.K. again...
MOVEQ #6,D0
MOVE.L D0,CurrSpeed
MOVE.W #1,PEDpos
MOVE.L #ModulesPath2,PathPtr
MOVE.L #CopList,CopListPtr
MOVE.L #CopListBitplanes,CopListBplPtr
MOVE.L #CopListColors,CopListColorPtr
MOVE.L #CopListBpl4,CopListBpl4Ptr
MOVE.L #KbdTransTable2,KeyTransTabPtr
MOVE.L #NoteNames1,NoteNamesPtr
MOVE.L #VUMeterColors,TheRightColors
MOVE.L #BitplaneData,D0 ; Set pointers to bitplane data
LEA CopListBitplanes,A1
MOVE.W D0,6(A1)
SWAP D0
MOVE.W D0,2(A1)
SWAP D0
ADD.L #10240,D0
MOVE.W D0,14(A1)
SWAP D0
MOVE.W D0,10(A1)
BSR SetDefSpritePtrs
BSR UpdateCursorPos
JSR RedrawPattern
JSR ShowPosition
JSR ShowSongLength
MOVE.W #1,InsNum
JSR ShowSampleInfo
LEA TopMenusPos,A0
LEA TopMenusBuffer,A1
MOVEQ #43,D0
stmloop MOVEQ #24,D1
stmloop2
MOVE.B (A0)+,(A1)+
MOVE.B $27FF(A0),$044B(A1)
DBRA D1,stmloop2
LEA 15(A0),A0
DBRA D0,stmloop
BSR DoResetAll
BSR cfgupda
BSR DoLoadConfig
MOVE.L #NoteNames1,NoteNamesPtr
TST.B Accidental
BEQ .skip
MOVE.L #NoteNames2,NoteNamesPtr
.skip JSR DoLoadPLST
ChangeCopList
TST.W SamScrEnable
BNE Return1
BSR SetupAnaCols
SetupVUCols
TST.W SamScrEnable
BNE Return1
LEA CopListMark2,A0 ; VUmeter coloring
MOVE.W #$BA07,D5 ; Start position
LEA VUmeterColors,A5
MOVEQ #47,D7 ; Change 48 lines
alotlp4 MOVE.W D5,(A0)+
MOVE.W #$FFFE,(A0)+
LEA VUmeterColRegs(PC),A1
MOVEQ #1,D6
alotlp5 MOVE.W (A5),D4
MOVE.W (A1)+,(A0)+
MOVE.W #3,FadeX
MOVE.W D4,D0
BSR FadeCol
MOVE.W D0,(A0)+
MOVE.W (A1)+,(A0)+
MOVE.W D4,(A0)+
MOVE.W (A1)+,(A0)+
MOVE.W #-3,FadeX
MOVE.W D4,D0
BSR FadeCol
MOVE.W D0,(A0)+
DBRA D6,alotlp5
ADDQ.W #2,A5
ADD.W #$0100,D5 ; Next line...
DBRA D7,alotlp4
RTS
VUmeterColRegs
dc.w $01B2,$01B4,$01B6,$01BA,$01BC,$01BE
CopListBpl4Ptr dc.l 0
CopListPtr dc.l 0
CopListBplPtr dc.l 0
CopListColorPtr dc.l 0
DOSname dc.b 'dos.library',0
IntuitionName dc.b 'intuition.library',0
GraphicsName dc.b 'graphics.library',0,0
SetupAnaCols
LEA CopListAnalyzer,A5
MOVE.W ColorTable+12,D2
MOVEQ #39,D0 ; Change col 40 lines
MOVE.W #$687D,D1 ; Start pos
sacloop MOVE.W D1,(A5)+ ; Set wait
MOVE.W #$FFFE,(A5)+
MOVE.W #$018C,(A5)+ ; Set analyzer color
ADDQ.L #2,A5
ADD.W #$0060,D1 ; Move x-pos
MOVE.W D1,(A5)+ ; Wait
MOVE.W #$FFFE,(A5)+
MOVE.W #$018C,(A5)+ ; Set text color
MOVE.W D2,(A5)+
ADD.W #$0100,D1 ; Next line...
SUB.W #$0060,D1
DBRA D0,sacloop
TST.B DisableAnalyzer
BNE.S ClearAnalyzerColors
SetAnalyzerColors
LEA CopListAnalyzer+6,A1
LEA AnalyzerColors,A0
MOVEQ #39,D0 ; 40 lines
sanclop MOVE.W (A0)+,(A1)
LEA 16(A1),A1
DBRA D0,sanclop
RTS
ClearAnalyzerColors
LEA CopListAnalyzer+6,A0
MOVE.W ColorTable+12,D1
MOVEQ #39,D0 ; 40 lines.
cacloop MOVE.W D1,(A0)
LEA 16(A0),A0
DBRA D0,cacloop
RTS
SetSamSpritePtrs
MOVE.L #LoopSpriteData1,Ch1SpritePtr
MOVE.L #LoopSpriteData2,Ch2SpritePtr
MOVE.L #PlayPosSpriteData,Ch3SpritePtr
MOVE.L #NoSpriteData,Ch4SpritePtr
BRA.S sdsp2
SetDefSpritePtrs
MOVE.L #VUSpriteData1,Ch1SpritePtr
MOVE.L #VUSpriteData2,Ch2SpritePtr
MOVE.L #VUSpriteData3,Ch3SpritePtr
MOVE.L #VUSpriteData4,Ch4SpritePtr
sdsp2 MOVE.L #CursorSpriteData,CursorPosPtr
MOVE.L #PointerSpriteData,PointerSpritePtr
MOVE.L #LineCurSpriteData,LineCurPosPtr
MOVE.L #NoSpriteData,NoSpritePtr
MOVE.L PointerSpritePtr,SpritePtrsPtr
LEA SpritePtrsPtr,A0 ; Set pointers to spritedata
LEA CopList,A1
MOVEQ #15,D2
alotloop2
MOVE.W (A0)+,2(A1)
ADDQ.L #4,A1
DBRA D2,alotloop2
RTS
PointerSpritePtr
dc.l 0
;---- AutoRequest() ----
SetAutoReq
MOVE.L 4.W,A6
JSR LVOForbid(A6)
MOVE.L IntuitionBase,A1
MOVE.L #NewAutoRequest,D0
MOVE.L #LVOAutoRequest,A0
JSR LVOSetFunction(A6)
MOVE.L D0,AutoReqSave
MOVE.L D0,xyzza+2
JSR LVOPermit(A6)
RTS
ResetAutoReq
MOVE.L 4.W,A6
MOVE.L IntuitionBase,A1
MOVE.L AutoReqSave(PC),D0
MOVE.L #LVOAutoRequest,A0
JSR LVOSetFunction(A6)
RTS
NewAutoRequest
TST.W MountFlag
BNE PositiveReturn
TST.B AutoReqRunning
BNE.S xyzza
BSET #0,AutoReqRunning
MOVE.L A0,-(SP)
MOVE.L GfxBase,A0
MOVE.L 38(A0),$DFF080
MOVE.L (SP)+,A0
xyzzy JSR $0
MOVE.L #CopList,$DFF080
BCLR #0,AutoReqRunning
RTS
xyzza JMP $0
AutoReqSave EQU xyzzy+2
;---- Special Uffda function for Intuition version 37+ -----
TestUffda
MOVE.L IntuitionBase,A6
MOVE.L 60(A6),D0 ; FirstScreen
BEQ Return1
.wbloop MOVE.L D0,A0
MOVE.W 20(A0),D0 ; Flags
AND.W #$000F,D0
CMP.W #1,D0
BEQ.S .wbfound
MOVE.L (A0),D0
BEQ Return1
BRA.S .wbloop
.wbfound
MOVE.L PTProcess,D1
MOVE.L 4(A0),D0 ; FirstWindow
BEQ Return1
.loop MOVE.L D0,A0
MOVE.L 86(A0),D0 ; UserPort
BEQ Return1
MOVE.L D0,A1
CMP.L 16(A1),D1 ; SigTask
BEQ.S .foundwin
MOVE.L (A0),D0
BEQ .notfoundwin
BRA.S .loop
.foundwin
BTST #1,AutoReqRunning ; Det er noe der!
BNE Return1
BSET #1,AutoReqRunning
BRA ResetCopList
.notfoundwin
BTST #1,AutoReqRunning ; Ikke noe der!
BEQ Return1
BCLR #1,AutoReqRunning
BRA SetCopList
;---- DisplayAlert() ----
SetDispAlert
MOVE.L IntuitionBase,A0
MOVE.L LVODisplayAlert+2(A0),DispAlertSave
MOVE.L #NewDispAlert,LVODisplayAlert+2(A0)
RTS
ResetDispAlert
MOVE.L IntuitionBase,A0
MOVE.L DispAlertSave,LVODisplayAlert+2(A0)
RTS
NewDispAlert
MOVEM.L D0-D7/A0-A6,-(SP)
LEA SoftFailText(PC),A1
ADDQ.L #3,A0
MOVEQ #16,D0
ndaloop CMP.B (A1)+,(A0)+
BNE.S ndaexit
DBRA D0,ndaloop
BSR FindAdr
TST.L D0
BEQ.S ndaexit
MOVE.L D0,A1
MOVE.L SongDataPtr,A0
MOVE.L #70716,D0
ndalop2 MOVE.B (A0)+,D1
MOVE.W D1,$DFF180
MOVE.B D1,(A1)+
SUBQ.L #1,D0
BNE.S ndalop2
ndaexit MOVEM.L (SP)+,D0-D7/A0-A6
xyzzy2 JMP $FC0000
DispAlertSave EQU xyzzy2+2
SoftFailText dc.b "Software Failure.",0
;---- Copper List ----
SetCopList
MOVE.L #CopList,$DFF080
RTS
ResetCopList
MOVE.L GfxBase,A0
MOVE.L 38(A0),$DFF080
RTS
;---- Vertical Blank Interrupt ----
SetVBInt
MOVEQ #5,D0
LEA VBIntServer,A1
MOVE.L 4.W,A6
JSR LVOAddIntServer(A6)
RTS
ResetVBInt
MOVEQ #5,D0
LEA VBIntServer,A1
MOVE.L 4.W,A6
JSR LVORemIntServer(A6)
RTS
vbint MOVEM.L D0-D7/A0-A6,-(SP)
BSR UpdatePointerPos
BSR VUmeters
BSR Scope
BSR SpecAnaInt
BSR ArrowKeys
BSR CheckKeyRepeat
BSR UpdateTicks
BSR TestUffda
MOVEM.L (SP)+,D0-D7/A0-A6
RTS
VBIntServer
dc.l 0,0
dc.b 2,0 ; type, priority
dc.l vbintname
dc.l 0,vbint
vbintname
dc.b "Protracker VBlank",0
;---- Music Interrupt ----
SetMusicInt
TST.B IntMode
BNE.S SetCIAInt
MOVEQ #5,D0
LEA MusicIntServer,A1
MOVE.L 4.W,A6
JSR LVOAddIntServer(A6)
RTS
ResetMusicInt
TST.B IntMode
BNE ResetCIAInt
MOVEQ #5,D0
LEA MusicIntServer,A1
MOVE.L 4.W,A6
JSR LVORemIntServer(A6)
RTS
MusicIntServer
dc.l 0,0
dc.b 2,1 ; type, priority
dc.l musintname
dc.l 0,IntMusic
musintname dc.b "Protracker MusicInt",0
;---- CIA Interrupt ----
ciatalo = $400
ciatahi = $500
ciatblo = $600
ciatbhi = $700
ciacra = $E00
ciacrb = $F00
SetCIAInt
MOVEQ #2,D6
LEA $BFD000,A5
MOVE.B #'b',CIAAname+3
SetCIALoop
MOVEQ #0,D0
LEA CIAAname(PC),A1
MOVE.L 4.W,A6
JSR LVOOpenResource(A6)
MOVE.L D0,CIAAbase
BEQ Return1
MOVE.L D0,A6
MOVE.L GfxBase,A0
MOVE.W 206(A0),D0 ; DisplayFlags
BTST #2,D0 ; PAL?
BEQ.S WasNTSC
MOVE.L #1773447,D7 ; PAL
BRA.S sciask
WasNTSC MOVE.L #1789773,D7 ; NTSC
sciask MOVE.L D7,TimerValue
DIVU #125,D7 ; Default to normal 50 Hz timer
CMP.W #2,D6
BEQ.S TryTimerA
TryTimerB
LEA MusicIntServer(PC),A1
MOVEQ #1,D0 ; Bit 1: Timer B
JSR AddICRVector(A6)
MOVE.L #1,TimerFlag
TST.L D0
BNE.S CIAError
MOVE.L A5,CIAAaddr
MOVE.B D7,ciatblo(A5)
LSR.W #8,D7
MOVE.B D7,ciatbhi(A5)
BSET #0,ciacrb(A5)
BRA SetTempo
TryTimerA
LEA MusicIntServer(PC),A1
MOVEQ #0,D0 ; Bit 0: Timer A
JSR AddICRVector(A6)
CLR.L TimerFlag
TST.L D0
BNE.S CIAError
MOVE.L A5,CIAAaddr
MOVE.B D7,ciatalo(A5)
LSR.W #8,D7
MOVE.B D7,ciatahi(A5)
BSET #0,ciacra(A5)
BRA SetTempo
CIAError
MOVE.B #'a',CIAAname+3
LEA $BFE001,A5
SUBQ.W #1,D6
BNE SetCIALoop
CLR.L CIAAbase
RTS
ResetCIAInt
MOVE.L CIAAbase(PC),D0
BEQ Return1
CLR.L CIAAbase
MOVE.L D0,A6
MOVE.L CIAAaddr(PC),A5
TST.L TimerFlag
BEQ.S ResTimerA
BCLR #0,ciacrb(A5)
MOVEQ #1,D0
BRA.S RemInt
ResTimerA
BCLR #0,ciacra(A5)
MOVEQ #0,D0
RemInt LEA MusicIntServer(PC),A1
MOVEQ #0,d0
JSR RemICRVector(A6)
RTS
CIAAname dc.b 'ciaa.resource',0
CIAAbase dc.l 0
TimerFlag dc.l 0
TimerValue dc.l 0
;---- Tempo ----
TempoGadg
CMP.W #60,D0
BHS Return1
CMP.W #44,D0
BHS.S TemDown
TemUp MOVE.W RealTempo(PC),D0
ADDQ.W #1,D0
BTST #2,$DFF016
BNE.S teupsk
ADDQ.W #8,D0
ADDQ.W #1,D0
teupsk CMP.W #255,D0
BLS.S teposk
MOVE.W #255,D0
teposk MOVE.W D0,RealTempo
BSR SetTempo
BRA Wait_4000
TemDown MOVE.W RealTempo(PC),D0
SUBQ.W #1,D0
BTST #2,$DFF016
BNE.S tednsk
SUBQ.W #8,D0
SUBQ.W #1,D0
tednsk CMP.W #32,D0
BHS.S teposk
MOVE.W #32,D0
BRA.S teposk
ChangeTempo
CMP.W #94,D0
BHS.S TempoDown
CMP.W #80,D0
BHS.S TempoUp
RTS
TempoUp MOVE.W Tempo,D0
ADDQ.W #1,D0
BTST #2,$DFF016
BNE.S temupsk
ADDQ.W #8,D0
ADDQ.W #1,D0
temupsk CMP.W #255,D0
BLS.S temposk
MOVE.W #255,D0
temposk MOVE.W D0,Tempo
MOVE.W D0,RealTempo
BSR.S ShowTempo
BSR.S SetTempo
BRA Wait_4000
TempoDown
MOVE.W Tempo,D0
SUBQ.W #1,D0
BTST #2,$DFF016
BNE.S temdnsk
SUBQ.W #8,D0
SUBQ.W #1,D0
temdnsk CMP.W #32,D0
BHS.S temposk
MOVE.W #32,D0
BRA.S temposk
ShowTempo
MOVE.W #607,TextOffset
MOVE.W RealTempo(PC),WordNumber
JMP Print3DecDigits
SetTempo
MOVEQ #125,D0
MOVE.L CIAAbase(PC),D1
BEQ.S setesk3
MOVE.W RealTempo(PC),D0
CMP.W #32,D0
BHS.S setemsk
MOVEQ #32,D0
setemsk MOVE.W D0,RealTempo
setesk3 TST.W SamScrEnable
BNE.S setesk2
MOVE.W #4964,TextOffset
MOVE.W D0,WordNumber
JSR Print3DecDigits
setesk2 MOVE.L CIAAbase(PC),D0
BEQ Return1
MOVE.W RealTempo(PC),D0
MOVE.L TimerValue(PC),D1
DIVU D0,D1
MOVE.L CIAAaddr(PC),A5
MOVE.L TimerFlag(PC),D0
BEQ.S SetTemA
MOVE.B D1,ciatblo(A5) ;and set the CIA timer
LSR.W #8,D1
MOVE.B D1,ciatbhi(A5)
RTS
SetTemA MOVE.B D1,ciatalo(A5)
LSR.W #8,D1
MOVE.B D1,ciatahi(A5)
RTS
RealTempo dc.w 125
CIAAaddr dc.l 0
;---- Input Event Handler ----
SetInputHandler
MOVE.L 4.W,A6
LEA InpEvPort,A1
JSR LVOAddPort(A6)
LEA InputDevName,A0
MOVEQ #0,D0
LEA InpEvIOReq,A1
MOVEQ #0,D1
MOVE.L #InpEvPort,14(A1)
JSR LVOOpenDevice(A6)
LEA InpEvIOReq,A1
MOVE.W #9,IO_COMMAND(A1) ; IND_ADDHANDLER
MOVE.B #1,IO_FLAGS(A1)
MOVE.L #InpEvStuff,IO_DATA(A1)
JSR LVOSendIO(A6)
RTS
ResetInputHandler
MOVE.L 4.W,A6
LEA InpEvIOReq,A1
MOVE.W #10,IO_COMMAND(A1) ; IND_REMHANDLER
MOVE.B #1,IO_FLAGS(A1)
MOVE.L #InpEvStuff,IO_DATA(A1)
JSR LVOSendIO(A6)
LEA InpEvIOReq,A1
JSR LVOCloseDevice(A6)
LEA InpEvPort,A1
JSR LVORemPort(A6)
RTS
InpEvStuff
dc.l 0,0
dc.b 2,52 ; type, priority
dc.l inpevname
dc.l 0,InputHandler
inpevname
dc.b "Protracker InputHandler",0
InputHandler ; A0-InputEvent, A1-Data Area
MOVEM.L D1/A0-A3,-(SP)
TST.B AutoReqRunning
BNE.S inphend
SUB.L A2,A2
MOVE.L A0,A1
MOVE.B 4(A1),D0 ; ie_Class
CMP.B #1,D0 ; RAWKEY
BEQ.S InpRawkey
CMP.B #2,D0 ; RAWMOUSE
BEQ.S InpRawmouse
MOVE.L A1,A2
InpNext MOVE.L (A1),A1
MOVE.L A1,D0
BNE.S InputHandler
inphend MOVE.L A0,D0
MOVEM.L (SP)+,D1/A0-A3
RTS
InpRawkey
BSR InpUnchain
MOVE.W 6(A1),D0
BSR ProcessRawkey
BRA InpNext
InpRawmouse
BSR InpUnchain
MOVE.W MouseX3,D0
MOVE.W MouseY3,D1
ADD.W 10(A1),D0
ADD.W 12(A1),D1
TST.W D0
BPL.S irskip1
MOVEQ #0,D0
irskip1 TST.W D1
BPL.S irskip2
MOVEQ #0,D1
irskip2 CMP.W #640,D0
BLO.S irskip3
MOVE.W #639,D0
irskip3 CMP.W #512,D1
BLO.S irskip4
MOVE.W #511,D1
irskip4 MOVE.W D0,MouseX3
MOVE.W D1,MouseY3
LSR.W #1,D0
LSR.W #1,D1
MOVE.W D0,MouseX
MOVE.W D1,MouseY
BRA.S InpNext
InpUnchain
MOVE.L A2,D0
BNE.S InpUnc2
MOVE.L (A1),A0
RTS
InpUnc2 MOVE.L (A1),(A2)
RTS
;---- Process rawkey code from the keyboard ----
ProcessRawkey
CMP.B LastRawkey,D0
BEQ Return1
MOVE.B D0,LastRawkey
CMP.B #67+128,D0
BEQ LowerInstr2
CMP.B #96,D0
BEQ ShiftOn
CMP.B #97,D0
BEQ ShiftOn2
CMP.B #100,D0
BEQ AltOn
CMP.B #101,D0
BEQ AltOn2
CMP.B #99,D0
BEQ CtrlOn
CMP.B #102,D0
BEQ LeftAmigaOn
CMP.B #99+128,D0
BEQ CtrlOff
CMP.B #100+128,D0
BEQ AltOff
CMP.B #96+128,D0
BEQ.S ShiftOff
CMP.B #101+128,D0
BEQ AltOff
CMP.B #97+128,D0
BEQ.S ShiftOff
CMP.B #102+128,D0
BEQ LeftAmigaOff
CMP.B #98,D0
BEQ.S KeyRepOn
CMP.B #98+128,D0
BEQ.S KeyRepOff
kbintSetKey
TST.B D0
BNE.S kbintDoSet
MOVE.B #127,D0
kbintDoSet
MOVE.W KeyBufPos(PC),D1
CMP.W #KeyBufSize,D1
BHS Return1
LEA KeyBuffer(PC),A3
MOVE.B D0,(A3,D1.W)
ADDQ.W #1,KeyBufPos
RTS
LowerInstr2
CLR.W HiLowInstr
BRA.S kbintsetkey
KeyRepOn
ST KeyRepeat
RTS
KeyRepOff
SF KeyRepeat
RTS
ShiftOn MOVE.W #1,ShiftKeyStatus
RTS
ShiftOn2
MOVE.W #1,ShiftKeyStatus
BRA.S kbintsetkey
ShiftOff
CLR.W ShiftKeyStatus
RTS
AltOn MOVE.W #1,AltKeyStatus
RTS
AltOn2 MOVE.W #1,AltKeyStatus
BRA.S kbintsetkey
AltOff CLR.W AltKeyStatus
RTS
CtrlOn MOVE.W #1,CtrlKeyStatus
RTS
CtrlOff CLR.W CtrlKeyStatus
RTS
LeftAmigaOn
MOVE.W #1,LeftAmigaStatus
RTS
LeftAmigaOff
CLR.W LeftAmigaStatus
RTS
DoKeyBuffer
MOVE.W KeyBufPos(PC),D0
BEQ Return1
SUBQ.W #1,D0
LEA KeyBuffer(PC),A0
MOVE.B (A0,D0.W),D1
MOVE.W D0,KeyBufPos
MOVE.B D1,RawKeyCode
MOVE.B D1,SaveKey
MOVE.W KeyRepDelay,KeyRepCounter
BTST #7,D1
BEQ.S dkbend
CLR.W KeyRepCounter
dkbend RTS
KeyBufPos dc.w 0
KeyBuffer dcb.b KeyBufSize,0
ShiftKeyStatus dc.w 0
AltKeyStatus dc.w 0
CtrlKeyStatus dc.w 0
LeftAmigaStatus dc.w 0
LastRawkey dc.b 255,0
SaveKey dc.b 0
KeyRepeat dc.b 0
KeyRepCounter dc.w 0
;---- Key repeat ----
CheckKeyRepeat
TST.B KeyRepeat
BEQ Return1
MOVE.W KeyRepCounter(PC),D0
BEQ Return1
SUBQ.W #1,D0
BEQ.S RepDown
MOVE.W D0,KeyRepCounter
RTS
RepDown MOVE.B SaveKey(PC),RawKeyCode
MOVE.W KeyRepSpeed,KeyRepCounter
RTS
;---- Update Mousepointer Position ----
UpdatePointerPos
MOVE.W MouseX,D0
ADDQ.W #3,D0
MOVE.W MouseY,D1
MOVEQ #16,D2
MOVE.L PointerSpritePtr,A0
JMP SetSpritePos
;---- Timer ----
UpdateTicks
CMP.L #'patp',RunMode
BNE Return1
ADDQ.W #1,PatternTicks
MOVE.W PatternTicks(PC),D0
MOVE.L 4.W,A0
CMP.B $0212(A0),D0
BNE Return1
CLR.W PatternTicks
ADDQ.L #1,TimerTicks
RTS
ShowTimer
CMP.W #4,CurrScreen
BEQ Return1
MOVE.L TimerTicks(PC),D0
DIVU #60,D0
MOVE.W D0,WordNumber
SWAP D0
MOVE.W D0,D7
MOVE.W #4154,TextOffset
JSR Print2DecDigits
MOVE.W D7,WordNumber
ADDQ.W #1,TextOffset
JMP Print2DecDigits
PatternTicks dc.w 0
TimerTicks dc.l 0
;---- Spectrum Analyzer ----
SpecAnaInt
CMP.W #1,CurrScreen
BNE Return1
TST.B DisableAnalyzer
BNE Return1
.loop TST.B AnaDrawFlag
BNE Return1
ST AnaDrawFlag
MOVEQ #40,D5
MOVEQ #126,D6
LEA AnalyzerHeights,A0
LEA AnalyzerOpplegg,A1
LEA AnalyzerOffsets(PC),A2
MOVE.L TextBplPtr,A3
LEA 1976(A3),A3
MOVEQ #$16,D7
spanlab1
MOVE.W (A0)+,D0
CMP.W #36,D0
BLO.S spanskip2
MOVE.W #36,D0
spanskip2
MOVE.W (A1)+,D1
CMP.W D0,D1
BEQ.S spanskip3
BLO.S span_r2
SUB.W D0,D1
SUBQ.W #1,D1
ADD.W D0,D0
MOVE.W 0(A2,D0.W),D0
spanloop
CLR.B 0(A3,D0.W)
SUB.W D5,D0
DBRA D1,spanloop
BRA.S spanskip3
span_r2 SUB.W D1,D0
SUBQ.W #1,D0
LSL.W #1,D1
MOVE.W 0(A2,D1.W),D1
spanloop2 MOVE.B D6,0(A3,D1.W)
SUB.W D5,D1
DBRA D0,spanloop2
spanskip3
ADDQ.L #1,A3
DBRA D7,spanlab1
LEA AnalyzerHeights,A0
LEA AnalyzerOpplegg,A1
MOVEQ #22,D7
spanloop3 MOVE.W (A0),D0
MOVE.W D0,(A1)+
BEQ.S spanskip4
SUBQ.W #1,D0
spanskip4
MOVE.W D0,(A0)+
DBRA D7,spanloop3
SF AnaDrawFlag
RTS
ClearAnaHeights
LEA AnalyzerOpplegg,A0
LEA AnalyzerHeights,A1
MOVEQ #22,D7
MOVEQ #0,D0
cahloop MOVE.W D0,(A0)+
MOVE.W D0,(A1)+
DBRA D7,cahloop
RTS
PlayNoteAnalyze ; Called by keyboard play
MOVEM.L D0-D3/A0,-(SP)
MOVEQ #0,D2
MOVE.W 2(A6),D2
BRA.S SpecAna2
SpectrumAnalyzer ; Called by playroutine
TST.W (A4)
BEQ Return1
MOVEM.L D0-D3/A0,-(SP)
MOVEQ #0,D2
MOVE.B n_volume(A6),D2 ; Get channel volume
SpecAna2
TST.B AnaDrawFlag
BNE ohno
ST AnaDrawFlag
BSR SetAnalyzerVolumes
BEQ.S saend
LSL.W #8,D2
DIVU #682,D2
MOVE.W D2,D3
LSR.W #1,D3
LEA AnalyzerHeights,A0
SUB.W #113,D0 ; Subtract 113 (highest rate)
MOVE.W #743,D1
SUB.W D0,D1 ; Invert range 0-743
MULU D1,D1 ; 0 - 743^2
DIVU #25093,D1
MOVE.W D1,D0
CMP.W #46,D0
BLO.S saskip
MOVEQ #45,D0
saskip LSL.W #1,D0
ADD.W D2,(A0,D0.W)
CMP.W #36,(A0,D0.W)
BLO.S saskip2
MOVE.W #36,(A0,D0.W)
saskip2 TST.W D0
BEQ.S saskip3
ADD.W D3,-2(A0,D0.W)
CMP.W #36,-2(A0,D0.W)
BLO.S saskip3
MOVE.W #36,-2(A0,D0.W)
saskip3 CMP.W #44,D0
BEQ.S saend
ADD.W D3,2(A0,D0.W)
CMP.W #36,2(A0,D0.W)
BLO.S saend
MOVE.W #36,2(A0,D0.W)
saend SF AnaDrawFlag
ohno MOVEM.L (SP)+,D0-D3/A0
RTS
AnalyzerOffsets
dc.w $0730,$0708,$06E0,$06B8,$0690,$0668,$0640,$0618
dc.w $05F0,$05C8,$05A0,$0578,$0550,$0528,$0500,$04D8
dc.w $04B0,$0488,$0460,$0438,$0410,$03E8,$03C0,$0398
dc.w $0370,$0348,$0320,$02F8,$02D0,$02A8,$0280,$0258
dc.w $0230,$0208,$01E0,$01B8,$0190,$0168,$0140,$0118
dc.w $00F0
AnaDrawFlag dc.b 0,0
;---- Scope ----
ns_sampleptr = 0
ns_endptr = 4
ns_repeatptr = 8
ns_rependptr = 12
ns_period = 16
ns_volume = 18
Scope LEA audchan1temp,A0
LEA ScopeInfo,A2
LEA ScopeSamInfo,A1
LEA BlankSample,A3
MOVEQ.L #3,D6
ScoLoop MOVE.W (A0),D0
AND.W #$0FFF,D0
OR.W n_period(A0),D0
BEQ ScoSampleEnd ; end if no note & no period
MOVE.W n_period(A0),ns_period(A2)
MOVE.B n_volume(A0),ns_volume(A2)
TST.B n_trigger(A0)
BEQ ScoContinue
ScoRetrig
SF n_trigger(A0)
BSR SetScope
MOVEQ #0,D0
MOVE.B n_samplenum(A0),D0
SUBQ.W #1,D0
LSL.W #4,D0
MOVE.L ns_sampleptr(A1,D0.W),ns_sampleptr(A2)
MOVE.L ns_endptr(A1,D0.W),ns_endptr(A2)
MOVE.L ns_repeatptr(A1,D0.W),ns_repeatptr(A2)
MOVE.L ns_rependptr(A1,D0.W),ns_rependptr(A2)
MOVE.L ns_sampleptr(A2),D0
CMP.L A3,D0 ; at end of sample...
BEQ.S ScoNextChan
BRA ScoChk
ScoContinue
MOVE.L ns_sampleptr(A2),D0
CMP.L A3,D0 ; at end of sample...
BEQ.S ScoNextChan
MOVEQ.L #0,D1
MOVE.W ns_period(A2),D1
LSR.W #1,D1
BEQ.S ScoNextChan
MOVE.L #35469,D2
DIVU D1,D2
EXT.L D2
ADD.L D2,D0
ScoChk CMP.L ns_endptr(A2),D0
BLO.S ScoUpdatePtr
TST.L ns_repeatptr(A2)
BNE.S ScoSamLoop
ScoSampleEnd
MOVE.L A3,D0
BRA.S ScoUpdatePtr
ScoSamLoop
SUB.L ns_endptr(A2),D0
ADD.L ns_repeatptr(A2),D0
MOVE.L ns_rependptr(A2),ns_endptr(A2)
CMP.L ns_endptr(A2),D0
BHS ScoSamLoop
ScoUpdatePtr
MOVE.L D0,ns_sampleptr(A2)
ScoNextChan
ADD.L #20,A2
ADD.L #44,A0
DBRA D6,ScoLoop
; now draw channels
TST.B ScopeEnable
BEQ.S clsnot
CMP.W #1,CurrScreen
BNE.S clsnot
TST.B EdEnable
BNE.S clsnot
MOVE.L TextBplPtr,A0
ADD.L #2256,A0
MOVEQ #0,D0
MOVEQ #32,D1
clscop1 MOVEQ #5,D2
clscop2 MOVE.L D0,(A0)+
DBRA D2,clscop2
LEA 16(A0),A0
DBRA D1,clscop1
clsnot MOVEQ #-1,D4
TST.W SamScrEnable
BEQ.S ScoNClr
MOVEQ #0,D4
ScoNClr MOVEQ #0,D7
MOVE.W $DFF002,D6 ; dmaconr
MOVEQ #0,D5
MOVE.L #72*40+16,A1
LEA xBlankSample,A2
BTST #0,D6
BEQ.S ScoSkp1
LEA ScopeInfo,A2
MOVE.B ns_volume(A2),D5
ScoSkp1 BSR.S ScoDraw
MOVEQ #0,D5
MOVE.L #72*40+22,A1
LEA xBlankSample,A2
BTST #1,D6
BEQ.S ScoSkp2
LEA ScopeInfo+20,A2
MOVE.B ns_volume(A2),D5
ScoSkp2 BSR.S ScoDraw
MOVEQ #0,D5
MOVE.L #72*40+28,A1
LEA xBlankSample,A2
BTST #2,D6
BEQ.S ScoSkp3
LEA ScopeInfo+40,A2
MOVE.B ns_volume(A2),D5
ScoSkp3 BSR.S ScoDraw
MOVEQ #0,D5
MOVE.L #72*40+34,A1
LEA xBlankSample,A2
BTST #3,D6
BEQ.S ScoSkp4
LEA ScopeInfo+60,A2
MOVE.B ns_volume(A2),D5
ScoSkp4 BSR ScoDraw
TST.L D7
BEQ sdloscr
ScoRTS RTS
ScoDraw TST.B ScopeEnable
BEQ.S sdlpos
CMP.W #1,CurrScreen
BNE.S sdlpos
TST.B EdEnable
BNE.S sdlpos
LSR.W #1,D5
CMP.W #32,D5
BLS.S sdsk1
MOVEQ #32,D5
sdsk1 MOVE.L (A2),A0
ADD.L TextBplPtr,A1
MOVEQ #4,D2
sdlp1 MOVEQ #7,D3
sdlp2 MOVE.B (A0)+,D0 ; get byte
EXT.W D0 ; extend to word
NEG.W D0 ; negate
MULS D5,D0 ; multiply by volume
ASR.W #8,D0 ; shift down
MOVE.W D0,D1
ASL.W #5,D0 ; * 32
ASL.W #3,D1 ; * 8
ADD.W D1,D0 ; (32+8) = * 40
BSET D3,(A1,D0.W) ; set a bit
DBRA D3,sdlp2
ADDQ.L #1,A1 ; yes
sdlskip DBRA D2,sdlp1
sdlpos TST.B D4
BNE.S ScoRTS
LEA xBlankSample(PC),A0
CMP.L A0,A2
BEQ.S sdloscr
MOVE.L (A2),D1
MOVE.L SamDrawStart(PC),D0
CMP.L D0,D1
BLS.S ScoRTS
CMP.L SamDrawEnd(PC),D1
BHS.S ScoRTS
SUB.L D0,D1
MULU #314,D1
MOVE.L SamDisplay,D0
BEQ.S ScoRTS
DIVU D0,D1
ST D4
ST D7
MOVE.L D1,D0
ADDQ.W #6,D0
MOVE.W #139,D1
sdlpspr MOVEQ #64,D2
LEA PlayPosSpriteData,A0
JMP SetSpritePos
sdloscr MOVEQ #0,D0
MOVE.W #270,D1
BRA.S sdlpspr
SetScope
MOVEQ #0,D1
MOVE.B n_samplenum(A0),D1
SUBQ.W #1,D1
LSL.W #4,D1
LEA ScopeSamInfo,A4
LEA (A4,D1.W),A4
MOVE.L n_start(A0),D0
MOVE.L D0,ns_sampleptr(A4)
MOVEQ #0,D1
MOVE.W n_length(A0),D1
ADD.L D1,D0
ADD.L D1,D0
MOVE.L D0,ns_endptr(A4)
MOVE.L n_loopstart(A0),D0
MOVE.L D0,ns_repeatptr(A4)
MOVEQ #0,D1
MOVE.W n_replen(A0),D1
CMP.W #1,D1
BEQ.S sconorep
ADD.L D1,D0
ADD.L D1,D0
MOVE.L D0,ns_rependptr(A4)
BRA Return1
sconorep
CLR.L ns_repeatptr(A4)
RTS
ToggleAnaScope
TST.W notogfl
BNE return1
BSR WaitForButtonUp
MOVEQ #0,D4
TST.B AnaScopFlag
BNE.S tasana
ST AnaScopFlag
BRA RedrawAnaScope
tasana SF AnaScopFlag
BRA RedrawAnaScope
ScopeEnable dc.b 0
AnaScopFlag dc.b 1
xBlankSample dc.l BlankSample
SamDrawStart dc.l 0
SamDrawEnd dc.l 0
;---- Show Free/Tune Memory ----
DoShowFreeMem
MOVE.W #1,UpdateFreeMem
ShowFreeMem
MOVEM.L D0-D7/A0-A6,-(SP)
TST.W UpdateFreeMem
BEQ.S sfmskp
CLR.W UpdateFreeMem
CLR.L FreeMemory
CLR.L TuneMemory
sfmskp BSR ShowTuneMem
MOVEQ #MEMF_CHIP,D1
TST.B ShowPublicFlag
BEQ sfmskp2
MOVEQ #MEMF_PUBLIC,D1
sfmskp2 MOVE.L 4.W,A6
JSR LVOAvailMem(A6)
CMP.L FreeMemory(PC),D0
BEQ.S fremend
MOVE.L D0,FreeMemory
TST.B ShowDecFlag
BNE.S shfrdec
MOVE.L D0,D6
MOVE.W #5273,TextOffset
SWAP D0
AND.W #$FF,D0
MOVE.W D0,WordNumber
JSR PrintHexByte
MOVE.W D6,WordNumber
JSR PrintHexWord
fremend MOVEM.L (SP)+,D0-D7/A0-A6
RTS
shfrdec MOVE.L FreeMemory(PC),D0
MOVE.W #5273,TextOffset
JSR Print6DecDigits
BRA.S fremend
ShowTuneMem
MOVE.L SongDataPtr,A0
LEA 42(A0),A0
MOVE.W TuneUp(PC),D7
SUBQ.W #1,D7
MOVE.W #31,TuneUp
MOVEQ #0,D0 ; Zero length
stumeloop
MOVEQ #0,D1
MOVE.W (A0),D1
ASL.W #1,D1
ADD.L D1,D0 ; Add samplelength
ADD.L #30,A0
DBRA D7,stumeloop
ADD.L #1084,D0 ; Add 1084 to length
MOVE.L SongDataPtr,A0
MOVEQ #127,D7
ADD.L #952,A0
MOVEQ #0,D6
stumeloop2
MOVE.B (A0)+,D5
CMP.B D5,D6
BHI.S stumeskip
MOVE.B D5,D6
stumeskip
DBRA D7,stumeloop2
ADDQ.W #1,D6
ASL.L #8,D6
ASL.L #2,D6
ADD.L D6,D0 ; Add 1024 x Number of patterns
CMP.L TuneMemory(PC),D0
BEQ Return1
MOVE.L D0,TuneMemory
TST.B ShowDecFlag
BNE.S shtudec
MOVE.L D0,D6
MOVE.W #4993,TextOffset
SWAP D0
AND.W #$FF,D0
MOVE.W D0,WordNumber
JSR PrintHexByte
MOVE.W D6,WordNumber
JMP PrintHexWord
shtudec MOVE.L TuneMemory(PC),D0
MOVE.W #4993,TextOffset
JMP Print6DecDigits
UpdateFreeMem dc.w 0
FreeMemory dc.l 0
TuneMemory dc.l 0
TuneUp dc.w 31
;---- Audio Channel Toggles ----
CheckToggle
MOVE.W MouseY2,D0
CMP.W #1,CurrScreen
BNE Return1
CMP.W #44,D0
BHS Return1
DoToggleMute
CMP.W #34,D0
BHS.S ToggleCh4
CMP.W #23,D0
BHS.S ToggleCh3
CMP.W #12,D0
BHS.S ToggleCh2
ToggleCh1
LEA audchan1toggle(PC),A0
BRA.S TogCh
ToggleCh2
LEA audchan2toggle(PC),A0
BRA.S TogCh
ToggleCh3
LEA audchan3toggle(PC),A0
BRA.S TogCh
ToggleCh4
LEA audchan4toggle(PC),A0
TogCh CLR.B RawKeyCode
EOR.W #1,(A0)
BSR WaitForButtonUp
CLR.W D0
MOVE.W audchan4toggle(PC),D0
LSL.B #1,D0
OR.W audchan3toggle(PC),D0
LSL.B #1,D0
OR.W audchan2toggle(PC),D0
LSL.B #1,D0
OR.W audchan1toggle(PC),D0
MOVE.W D0,ActiveChannels
BSR.S RedrawToggles
BSR Wait_4000
BRA Wait_4000
RedrawToggles
CMP.W #1,CurrScreen
BNE Return1
LEA audchan1toggle(PC),A0
BSR.S RedrawSingleTogg
LEA audchan2toggle(PC),A0
BSR.S RedrawSingleTogg
LEA audchan3toggle(PC),A0
BSR.S RedrawSingleTogg
LEA audchan4toggle(PC),A0
RedrawSingleTogg
LEA BitplaneData,A1
MOVEQ #0,D0
MOVE.W 2(A0),D0
ADD.L D0,A1
MOVEQ #0,D0
MOVE.W 4(A0),D0
LEA ToggleONdata,A2
TST.W (A0)
BNE.S rtskip
LEA ToggleOFFdata,A2
rtskip ADD.L D0,A2
MOVEQ #10,D4
rtloop2 MOVE.W 88(A2),10240(A1)
MOVE.W (A2)+,(A1)
LEA 40(A1),A1
DBRA D4,rtloop2
RTS
rtdoit MOVEQ #10,D4
rtloop MOVE.W 132(A2),10240(A1)
MOVE.W (A2)+,(A1)
LEA 40(A1),A1
DBRA D4,rtloop
RTS
;---- VU Meters ----
VUmeters
LEA audchan1temp,A1
LEA VUSpriteData1,A2
MOVE.W audchan1toggle(PC),D0
BSR.S OneVUmeter
LEA audchan2temp,A1
LEA VUSpriteData2,A2
MOVE.W audchan2toggle(PC),D0
BSR.S OneVUmeter
LEA audchan3temp,A1
LEA VUSpriteData3,A2
MOVE.W audchan3toggle,D0
BSR.S OneVUmeter
LEA audchan4temp,A1
LEA VUSpriteData4,A2
MOVE.W audchan4toggle,D0
OneVUmeter
TST.L RunMode
BEQ.S VUmeterDown
TST.W (A1)
BEQ.S VUmeterDown
TST.W D0
BEQ.S VUmeterDown
TST.L Counter
BNE.S VUmeterDown
MOVEQ #0,D0 ; New note
MOVE.B n_volume(A1),D0 ; Get volume
CMP.W #$40,D0 ; Higher than $40 ?
BLS.S iccskip ; No, skip
MOVEQ #$40,D0 ; Yes, set to $40
iccskip LEA VUmeterHeights(PC),A3
MOVE.B #233,D7 ; Set to 233
SUB.B 0(A3,D0.W),D7 ; Subtract to get new height
MOVE.B D7,(A2)
RTS
VUmeterDown
CMP.B #233,(A2)
BEQ Return1
ADDQ.B #1,(A2)
RTS
audchan1toggle dc.w 1,78,0
Chan1Volume dc.w 0
audchan2toggle dc.w 1,518,$16
Chan2Volume dc.w 0
audchan3toggle dc.w 1,958,$2C
Chan3Volume dc.w 0
audchan4toggle dc.w 1,1398,$42
Chan4Volume dc.w 0
ActiveChannels dc.w 15
VUmeterHeights
dc.b 0,0,1,2,2,3,4,5,5,6,7,8,8,9,10,11
dc.b 11,12,13,14,14,15,16,17,17,18,19,20,20,21,22,23
dc.b 23,24,25,26,26,27,28,29,29,30,31,32,32,33,34,35
dc.b 35,36,37,38,38,39,40,41,41,42,43,44,44,45,46,47
dc.b 47,0
SetAnalyzerVolumes
MOVEM.L D0-D3/A0,-(SP)
LSL.W #8,D2
DIVU #640,D2
CMP.W #$F0A0,A5
BNE.S savCh2
TST.W audchan1toggle
BEQ.S savCh2
CMP.W Chan1Volume,D2 ; volume
BLO.S savCh2
MOVE.W D2,Chan1Volume
savCh2 CMP.W #$F0B0,A5
BNE.S savCh3
TST.W audchan2toggle
BEQ.S savCh3
CMP.W Chan2Volume,D2
BLO.S savCh3
MOVE.W D2,Chan2Volume
savCh3 CMP.W #$F0C0,A5
BNE.S savCh4
TST.W audchan3toggle
BEQ.S savCh4
CMP.W Chan3Volume,D2
BLO.S savCh4
MOVE.W D2,Chan3Volume
savCh4 CMP.W #$F0D0,A5
BNE.S savNone
TST.W audchan4toggle
BEQ.S savNone
CMP.W Chan4Volume,D2
BLO.S savNone
MOVE.W D2,Chan4Volume
savNone MOVEM.L (SP)+,D0-D3/A0
MOVEQ #1,D4
RTS
;---- Disk Op. ----
DiskOp CLR.B RawKeyCode
MOVE.W CurrScreen,D0
CMP.W #3,D0
BEQ ExitFromDir
CMP.W #1,D0
BNE Return1
ShowDirScreen
BSR WaitForButtonUp
MOVE.W #3,CurrScreen
ST DisableAnalyzer
ST NoSampleInfo
JSR ClearAnalyzerColors
BSR Clear100Lines
BSR.S SwapDirScreen
BEQ DisplayMainAll
BSR ShowDiskSpace
BSR ShowModPackMode
BSR ShowPackMode
BSR ShowRAWIFFmode
DoAutoDir
TST.B AutoDirFlag
BEQ SelectPath
MOVE.W DirPathNum,D0
BEQ LoadModuleGadg
CMP.W #1,D0
BEQ LoadSongGadg
CMP.W #2,D0
BEQ LoadSampleGadg
BRA SelectModules
SelectPath
MOVE.W DirPathNum,D0
BEQ SelectModules
CMP.W #1,D0
BEQ SelectSongs
BRA SelectSamples
SwapDirScreen
MOVE.L DecompMemPtr,D0
BEQ.S sdirs2
MOVE.L D0,A1
BSR.S ssets3
BRA FreeDecompMem
sdirs2 LEA DirScreenData,A0
MOVE.L #DirScreenSize,D0
BSR Decompact
BEQ Return1
ssets3 LEA BitplaneData,A0
MOVEQ #1,D2
sxloop1 MOVE.W #999,D0
sxloop2 MOVE.L (A0),D1
MOVE.L (A1),(A0)+
MOVE.L D1,(A1)+
DBRA D0,sxloop2
LEA 6240(A0),A0
DBRA D2,sxloop1
RTS
CheckDirGadgets
MOVEM.W MouseX2,D0/D1
CMP.W #44,D1
BHI CheckDirGadgets2
CMP.W #33,D1
BLS.S ExtrasMenu
CMP.W #11,D0
BLO DirBrowseGadg
CMP.W #187,D0
BLO DirPathGadg
CMP.W #216,D0
BLO ParentDirGadg
CMP.W #307,D0
BLO ShowFreeDiskGadg
BRA CheckDirGadgets2
ExtrasMenu
CMP.W #94,D0
BHS ToggleMenu
CMP.W #22,D1
BHI.S DeleteFileGadg
CMP.W #11,D1
BHI.S RenameFileGadg
BRA DiskFormatGadg
RenameFileGadg
BSR StorePtrCol
BSR WaitForButtonUp
BSR ClearFileNames
MOVE.L PathPtr,A4
BSR ShowDirPath
LEA FileNamesPtr(PC),A5
BSR HasDiskChanged
BEQ.S RenameFileDirOk
BSR ClearDirTotal
BSR DirDisk
BNE RestorePtrCol
RenameFileDirOk
MOVE.W FileNameScrollPos,D0
BSR RedrawFileNames
MOVE.W #10,Action
LEA SelectFileText,A0
JSR ShowStatusText
BRA RestorePtrCol
DeleteFileGadg
MOVE.W DirPathNum,D0
BEQ DeleteModuleGadg
CMP.W #1,D0
BEQ DeleteSongGadg
CMP.W #2,D0
BEQ DeleteSampleGadg
RTS
ToggleMenu
CMP.W #146,D0
BHS SelectMenu
CMP.W #22,D1
BHI ToggleIFFSave
CMP.W #11,D1
BHI.S ToggleSongPack
ToggleModPack
CLR.B ModPackMode
BSR ShowNotImpl
ShowModPackMode
LEA ToggleOFFText(PC),A0
TST.B ModPackMode
BEQ.S smpmskp
LEA ToggleONText2(PC),A0
smpmskp MOVEQ #3,D0
MOVE.W #175,D1
JSR ShowText3
BRA WaitForButtonUp
ShowNotImpl
LEA NotImplText(PC),A0
JSR ShowStatusText
BRA SetErrorPtrCol
NotImplText dc.b 'Not implemented',0
ToggleSongPack
EOR.B #1,PackMode
ShowPackMode
LEA ToggleOFFText(PC),A0
TST.B PackMode
BEQ.S spsskip
LEA ToggleONText2(PC),A0
spsskip MOVEQ #3,D0
MOVE.W #615,D1
JSR ShowText3
BRA WaitForButtonUp
ToggleIFFSave
EOR.B #1,RAWIFFMode
ShowRAWIFFMode
LEA RAWText(PC),A0
TST.B RAWIFFMode
BEQ.S sraffu
LEA IFFText(PC),A0
sraffu MOVEQ #3,D0
MOVE.W #1055,D1
JSR ShowText3
BRA WaitForButtonUp
RAWText dc.b "RAW",0
IFFText dc.b "IFF",0
SelectMenu
CMP.W #156,D0
BHS LoadMenu
CMP.W #22,D1
BHI SelectSamples
CMP.W #11,D1
BHI SelectSongs
BRA SelectModules
LoadMenu
CMP.W #238,D0
BHS.S SaveMenu
CMP.W #22,D1
BHI LoadSampleGadg
CMP.W #11,D1
BHI LoadSongGadg
BRA LoadModuleGadg
SaveMenu
CMP.W #22,D1
BHI SaveSampleGadg
CMP.W #11,D1
BHI SaveSongGadg
BRA SaveModuleGadg
CheckDirGadgets2
MOVEM.W MouseX2,D0/D1
CMP.W #3,CurrScreen
BNE Return1
CMP.W #307,D0
BLO FileNamePressed
CMP.W #44,D1
BLS FileNameOneUp
CMP.W #89,D1
BLO.S ExitFromDir
BRA FileNameOneDown
ExitFromDir
BSR WaitForButtonUp
CLR.B RawKeyCode
BSR SwapDirScreen
BSR Clear100Lines
DisplayMainAll
BSR DisplayMainScreen
JSR ShowSongLength
JSR ShowSampleInfo
JSR ShowSongName
JSR Show_MS
TST.W LoadInProgress
BNE.S dimaskp
JSR ShowAllRight
dimaskp JMP ShowPosition
DirBrowseGadg
MOVEQ #0,D3
MOVE.W DirPathNum,D3
LEA dpnum(PC),A0
ADD.L D3,A0
MOVEQ #0,D0
MOVE.B (A0),D0
ADDQ.B #1,D0
CMP.B #7,D0
BLO.S dbgskip
MOVEQ #0,D0
dbgskip MOVE.B D0,(A0)
MULU #5,D0
MOVE.L PathPtr,A0
MOVEQ #63,D1
MOVEQ #0,D2
dbglop1 MOVE.B D2,(A0)+
DBRA D1,dbglop1
LEA dirpaths(PC),A0
LEA -5(A0,D0.W),A0
TST.W D0
BNE.S dbgskp2
LEA ModulesPath,A0
TST.W D3
BEQ.S dbgskp2
LEA SongsPath,A0
CMP.W #1,D3
BEQ.S dbgskp2
LEA SamplePath,A0
dbgskp2 MOVE.L PathPtr,A1
dbglop2 MOVE.B (A0)+,(A1)+
BNE.S dbglop2
BSR ShowDirPath
MOVE.W #3,WaitTime
BRA WaitALittle
dirpaths
dc.b "DF0:",0,"DF1:",0,"DH0:",0,"DH1:",0,"RAM:",0,"ST-00:",0
dpnum dc.b 0,0,0,0
DirPathNum
dc.w 3
SelectModules
MOVEQ #0,D0
BRA.S ChangePath
SelectSongs
MOVEQ #1,D0
BRA.S ChangePath
SelectSamples
MOVEQ #2,D0
ChangePath
MOVE.L TextBplPtr,A0
LEA 178(A0),A0
MOVEQ #0,D2
MOVEQ #26,D1
chpalop MOVE.W D2,(A0)
LEA 40(A0),A0
DBRA D1,chpalop
LEA ModulesPath2,A4
MOVE.W #178,D1
MOVE.W D0,DirPathNum
BEQ.S chpaski
LEA SongsPath2,A4
MOVE.W #618,D1
CMP.W #1,D0
BEQ.S chpaski
LEA SamplePath2,A4
MOVE.W #1058,D1
chpaski MOVE.L TextBplPtr,A0
LEA (A0,D1.W),A0
MOVE.W #$0100,(A0)
MOVE.W #$0F80,40(A0)
MOVE.W #$0FC0,80(A0)
MOVE.W #$0F80,120(A0)
MOVE.W #$0100,160(A0)
MOVE.L A4,PathPtr
BSR ShowDirPath
BRA WaitForButtonUp
;---- Song Gadgets ----
LoadSongGadg
BSR StorePtrCol
BSR WaitForButtonUp
BSR ClearFileNames
BSR SelectSongs
LEA FileNamesPtr(PC),A5
BSR HasDiskChanged
BEQ LoadSongDirOk
BSR ClearDirTotal
BSR DirDisk
BNE RestorePtrCol
LoadSongDirOk
MOVE.W FileNameScrollPos,D0
BSR RedrawFileNames
MOVE.W #1,Action
LEA SelectSongText,A0
JSR ShowStatusText
BRA RestorePtrCol
SaveSongGadg
BSR SelectSongs
LEA SaveSongText,A0
BSR AreYouSure
BNE Return1
BSR RestorePtrCol
BSR ClearFileNames
BSR StopIt
JSR SaveSong
MOVE.W #1,Action
RTS
DeleteSongGadg
BSR WaitForButtonUp
BSR ClearFileNames
BSR SelectSongs
LEA FileNamesPtr(PC),A5
BSR HasDiskChanged
BEQ.S DeleteSongDirOk
BSR ClearDirTotal
BSR DirDisk
BEQ.S DeleteSongDirOk
BRA RestorePtrCol
DeleteSongDirOk
MOVE.W FileNameScrollPos,D0
BSR RedrawFileNames
MOVE.W #2,Action
LEA SelectSongText,A0
JSR ShowStatusText
BRA SetDeletePtrCol
;---- Module Gadgets ----
LoadModuleGadg
BSR StorePtrCol
BSR WaitForButtonUp
BSR ClearFileNames
BSR SelectModules
LEA FileNamesPtr(PC),A5
BSR HasDiskChanged
BEQ.S LoadModDirOk
BSR ClearDirTotal
BSR DirDisk
BEQ.S LoadModDirOk
BRA RestorePtrCol
LoadModDirOk
MOVE.W FileNameScrollPos,D0
BSR RedrawFileNames
MOVE.W #3,Action
LEA SelectModuleText,A0
JSR ShowStatusText
BRA RestorePtrCol
SaveModuleGadg
BSR SelectModules
LEA SaveModuleText,A0
BSR AreYouSure
BNE Return1
JSR SaveModule
MOVE.W #3,Action
JMP ShowAllRight
DeleteModuleGadg
BSR WaitForButtonUp
BSR ClearFileNames
BSR SelectModules
LEA FileNamesPtr(PC),A5
BSR HasDiskChanged
BEQ.S DeleteModDirOk
BSR ClearDirTotal
BSR DirDisk
BEQ.S DeleteModDirOk
BRA RestorePtrCol
DeleteModDirOk
MOVE.W FileNameScrollPos(PC),D0
BSR RedrawFileNames
MOVE.W #4,Action
LEA SelectModuleText,A0
JSR ShowStatusText
BRA SetDeletePtrCol
;---- Sample Gadgets ----
LoadSampleGadg
BSR StorePtrCol
BSR WaitForButtonUp
BSR ClearFileNames
BSR SelectSamples
LEA FileNamesPtr(PC),A5
BSR HasDiskChanged
BEQ.S LoadSampleDirOk
BSR ClearDirTotal
BSR DirDisk
BEQ.S LoadSampleDirOk
BRA RestorePtrCol
LoadSampleDirOk
MOVE.W FileNameScrollPos,D0
BSR RedrawFileNames
MOVE.W #5,Action
LEA SelectSampleText,A0
JSR ShowStatusText
BRA RestorePtrCol
SaveSampleGadg
BSR SelectSamples
CLR.B RawKeyCode
MOVE.W InsNum,D0
BEQ NotSampleNull
LEA SaveSampleText,A0
BSR AreYouSure
BNE Return1
dosavesample
BSR StorePtrCol
BSR CreateSampleName
MOVE.L DiskDataLength,D1
BEQ Return1
MOVEQ #0,D1
MOVE.W InsNum,D1
LSL.L #2,D1
LEA SamplePtrs,A0
MOVE.L 0(A0,D1.W),DiskDataPtr
BSR SetDiskPtrCol
MOVE.L DOSbase,A6
MOVE.L FileNamePtr,D1
MOVE.L #1006,D2
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BNE SaveSample
JSR CantOpenFile
BRA ErrorRestoreCol
SaveSample
LEA SavingSampleText,A0
JSR ShowStatusText
TST.B RAWIFFMode
BEQ savesam
MOVE.L FileHandle,D1
MOVE.L #IFFFORM,D2
MOVEQ #IFFEND-IFFFORM,D3
JSR LVOWrite(A6)
savesam MOVE.L FileHandle,D1
MOVE.L DiskDataPtr,D2
MOVE.L DiskDataLength,D3
JSR LVOWrite(A6)
MOVE.L FileHandle,D1
JSR LVOClose(A6)
CLR.L FileHandle
MOVE.W #5,Action
JSR ShowAllRight
BRA RestorePtrCol
IFFFORM dc.b "FORM"
dc.l 0
dc.b "8SVX"
IFFVHDR dc.b "VHDR"
dc.l 20
dc.l 0,0,32 ; oneshot, repeat, hisamples
dc.w 16726 ; This is really NTSC (16574 for PAL!!!)
dc.b 1,0 ; octaves, compression
dc.l $10000 ; volume
IFFNAME dc.b "NAME"
dc.l 24
dcb.b 24,0
dc.b "ANNO"
dc.l 16
dc.b "Protracker 1.2A",0
IFFBODY dc.b "BODY"
dc.l 0
IFFEND
;---- Delete Sample ----
DeleteSampleGadg
BSR StorePtrCol
BSR WaitForButtonUp
BSR ClearFileNames
BSR SelectSamples
LEA FileNamesPtr(PC),A5
BSR HasDiskChanged
BEQ.S DeleteSamDirOk
BSR ClearDirTotal
BSR DirDisk
BEQ.S DeleteSamDirOk
BRA RestorePtrCol
DeleteSamDirOk
MOVE.W FileNameScrollPos(PC),D0
BSR RedrawFileNames
MOVE.W #6,Action
LEA SelectSampleText,A0
JSR ShowStatusText
BRA SetDeletePtrCol
;---- Directory Path Gadget ----
DirPathGadg
BSR StorePtrCol
BSR SetWaitPtrCol
MOVE.L PathPtr,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #63,TextEndPtr
MOVE.W #19,TextLength
MOVE.W #1484,A4
BSR GetTextLine
BRA RestorePtrCol
CopyPath
LEA FileName,A1
TST.B (A0) ; If no path
BEQ Return1
cploop MOVE.B (A0)+,(A1)+ ; Copy path to filename
BNE.S cploop
CMP.B #':',-2(A1) ; If ending with ':' it's ok
BEQ.S PathCharBack
CMP.B #'/',-2(A1) ; If ending with '/' it's ok
BEQ.S PathCharBack
MOVE.B #'/',-1(A1) ; Add '/' to end path
RTS
PathCharBack
SUBQ.L #1,A1
RTS
ShowDirPath
CMP.W #3,CurrScreen
BNE Return1
MOVEM.L D0-D7/A0-A6,-(SP)
MOVE.L PathPtr,A0
MOVEQ #19,D0
MOVE.W #1484,D1
JSR ShowText3
MOVEM.L (SP)+,D0-D7/A0-A6
RTS
;---- File List Gadgets ----
FileNameOneUp
TST.W Action
BEQ Return1
LEA FileNamesPtr(PC),A5
MOVE.W FileNameScrollPos(PC),D0
BEQ Return1
SUBQ.W #1,D0
BTST #2,$DFF016
BNE RedrawFileNames
SUBQ.W #3,D0
BPL RedrawFileNames
MOVEQ #0,D0
BRA RedrawFileNames
FileNameOneDown
TST.W Action
BEQ Return1
LEA FileNamesPtr(PC),A5
MOVE.W FileNameScrollPos(PC),D0
ADDQ.W #1,D0
BTST #2,$DFF016
BNE.S fnod2
ADDQ.W #3,D0
fnod2 MOVE.W 16(A5),D1
SUBQ.W #8,D1
BMI Return1
CMP.W D1,D0
BLS RedrawFileNames
MOVE.W D1,D0
BRA RedrawFileNames
;---- Clicked on a filename ----
FileNamePressed
SUB.W #44,D1
MOVE.W #1,UpdateFreeMem
TST.W Action
BEQ Return1
CMP.W #3,D1
BLO Return1
CMP.W #50,D1
BHI Return1
SUBQ.W #3,D1
AND.L #$FFFF,D1
DIVU #6,D1
MOVE.W D1,FileNameScrollPos+2
LEA FileNamesPtr(PC),A5
MOVE.W FileNameScrollPos(PC),D0
ADD.W D1,D0
CMP.W 16(A5),D0
BHS Return1
MULU #36,D0
ADD.L (A5),D0
MOVE.L D0,A0
TST.L 32(A0)
BMI.S AddDirectory
MOVEQ #DirNameLength-1,D0
LEA DirInputName,A1
fnploop MOVE.B (A0)+,(A1)+
DBRA D0,fnploop
MOVE.W Action,D6
CMP.W #1,D6
BEQ LoadSong
CMP.W #2,D6
BEQ DeleteSong
CMP.W #3,D6
BEQ xLoadModule
CMP.W #4,D6
BEQ DeleteModule
CMP.W #5,D6
BEQ LoadSample
CMP.W #6,D6
BEQ DeleteSample
CMP.W #10,D6
BEQ RenameFile
RTS
xLoadModule JMP LoadModule
AddDirectory
MOVE.L A0,-(SP)
MOVE.L PathPtr,A0
BSR CopyPath
MOVE.L (SP)+,A0
MOVEQ #DirNameLength-1,D0
addplop MOVE.B (A0)+,(A1)+
DBRA D0,addplop
LEA FileName,A0
MOVE.L PathPtr,A1
MOVEQ #62,D0
addplp2 MOVE.B (A0)+,(A1)+
DBRA D0,addplp2
addpdir BSR ShowDirPath
MOVE.W Action,D6
CMP.W #1,D6
BEQ LoadSongGadg
CMP.W #2,D6
BEQ DeleteSongGadg
CMP.W #3,D6
BEQ LoadModuleGadg
CMP.W #4,D6
BEQ DeleteModuleGadg
CMP.W #5,D6
BEQ LoadSampleGadg
CMP.W #6,D6
BEQ DeleteSampleGadg
CMP.W #10,D6
BEQ RenameFileGadg
RTS
ParentDirGadg
BSR WaitForButtonUp
MOVE.L PathPtr,A0
MOVE.L A0,A1
pdgloop TST.B (A1)+
BNE.S pdgloop
SUBQ.L #1,A1
CMP.L A0,A1
BLS Return1
SUBQ.L #1,A1
CMP.B #'/',(A1)
BNE.S pdgskp1
CLR.B (A1)
pdgskp1 CMP.B #':',(A1)
BEQ.S addpdir
CMP.B #'/',(A1)
BEQ pdgslsh
CLR.B (A1)
CMP.L A0,A1
BLS.S addpdir
SUBQ.L #1,A1
BRA.S pdgskp1
pdgslsh CLR.B (A1)
BRA addpdir
FileNamesPtr
dc.l 0 ; A5+ 0
dc.l 0 ; + 4
dc.l 0 ; + 8
dc.l 0 ; +12
dc.w 0 ; +16
dc.w 24 ; +18
FileNameScrollPos
dc.w 0
dc.w 0
;---- Has Disk Changed ----
HasDiskChanged
MOVE.L DOSbase,A6
MOVE.L A4,D1
MOVEQ #-2,D2
JSR LVOLock(A6)
MOVE.L D0,FileLock
BEQ.S ExamineError
MOVE.L FileLock,D1
MOVE.L #FileInfoBlock,D2
JSR LVOExamine(A6)
TST.L D0
BEQ.S ExamineError
LEA FileInfoBlock,A0
MOVE.L ofib_DateStamp+ds_Days(A0),D0
CMP.L 4(A5),D0
BNE.S DiskChanged
MOVE.L ofib_DateStamp+ds_Minute(A0),D0
CMP.L 8(A5),D0
BNE.S DiskChanged
MOVE.L ofib_DateStamp+ds_Tick(A0),D0
CMP.L 12(A5),D0
BNE.S DiskChanged
MOVE.L FileLock,D1
JSR LVOUnLock(A6)
MOVEQ #0,D0
RTS
DiskChanged
MOVE.L ofib_DateStamp+ds_Days(A0),4(A5)
MOVE.L ofib_DateStamp+ds_Minute(A0),8(A5)
MOVE.L ofib_DateStamp+ds_Tick(A0),12(A5)
MOVE.L FileLock,D1
JSR LVOUnLock(A6)
MOVEQ #-1,D0
RTS
ExamineError
CLR.L 4(A5)
MOVEQ #-1,D0
RTS
ShowFreeDiskGadg
BSR WaitForButtonUp
BSR.S LockAndGetInfo
BSR DirDiskUnlock
JMP ShowAllRight
LockAndGetInfo
BSR StorePtrCol
BSR SetDiskPtrCol
CLR.W FileNameScrollPos
MOVE.L DOSbase,A6
MOVE.L A4,D1 ; Dir-path in A4
MOVEQ #-2,D2
JSR LVOLock(A6)
MOVE.L D0,FileLock
BEQ DirDiskError
LEA ReadingDirText,A0
JSR ShowStatusText
MOVE.L FileLock,D1
MOVE.L #InfoData,D2
JSR LVOInfo(A6)
LEA InfoData,A0
MOVE.L 12(A0),D0 ; id_NumBlocks
SUB.L 16(A0),D0 ; id_NumBlocksUsed
MULU 22(A0),D0 ; id_BytesPerBlock + 2
MOVE.L D0,FreeDiskSpace
ShowDiskSpace
MOVE.W #1510,TextOffset
MOVE.L FreeDiskSpace,D7
TST.B ShowDecFlag
BNE.S sdsdec
SWAP D7
MOVE.W D7,WordNumber
JSR PrintHexWord
SWAP D7
MOVE.W D7,WordNumber
JSR PrintHexWord
MOVEQ #0,D0
RTS
sdsdec DIVU #10000,D7
MOVE.W D7,WordNumber
JSR Print4DecDigits
SWAP D7
MOVE.W D7,WordNumber
JSR Print4DecDigits
MOVEQ #0,D0
RTS
;---- Get Disk Directory ----
AllocDirMem
ADD.W #50,DirEntries
MOVE.W DirEntries,D0
MULU #36,D0
MOVE.L DirAllocSize(PC),D6
MOVE.L D0,DirAllocSize
MOVE.L #MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,D7
BEQ.S baehsj
MOVE.L FileNamesPtr(PC),D1
MOVE.L D7,FileNamesPtr
TST.L D1
BEQ Return1
TST.L D6
BEQ Return1
MOVE.L D1,A0
MOVE.L D7,A1
MOVE.L D6,D0
admloop MOVE.B (A0)+,(A1)+
SUBQ.L #1,D6
BNE.S admloop
MOVE.L D1,A1
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
RTS
FreeDirMem
MOVE.L FileNamesPtr(PC),D1
BEQ Return1
MOVE.L D1,A1
MOVE.L DirAllocSize(PC),D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
CLR.L FileNamesPtr
CLR.W DirAllocSize
CLR.W DirEntries
RTS
baehsj BSR OutOfMemErr
MOVEQ #-1,D0
RTS
DirAllocSize dc.l 0
DirEntries dc.w 0
DirDisk BSR FreeDirMem
BSR AllocDirMem
BSR LockAndGetInfo
BNE Return1
MOVE.L FileLock,D1
MOVE.L #FileInfoBlock,D2
JSR LVOExamine(A6)
TST.L D0
BEQ DirDiskError
ddloop1 MOVE.L FileLock,D1
MOVE.L #FileInfoBlock,D2
MOVE.L DOSBase,A6
JSR LVOExNext(A6)
TST.L D0
BEQ DirDiskUnlock
BTST #2,$DFF016
BEQ.S AbortDir
BSR NewDirEntry
BRA.S ddloop1
AbortDir
CLR.L 4(A5)
LEA DirAbortedText(PC),A0
JSR ShowStatusText
BSR.S DirDiskUnlock
BSR WaitALittle
JSR ShowAllRight
MOVEQ #0,D0
RTS
DirDiskUnlock
MOVE.L FileLock,D1
JSR LVOUnLock(A6)
BSR RestorePtrCol
MOVEQ #0,D0
RTS
DirAbortedText dc.b 'dir aborted !',0
DirDiskError
TST.L FileLock
BEQ.S ddeskip
MOVE.L FileLock,D1
JSR LVOUnLock(A6)
ddeskip BSR RestorePtrCol
LEA CantFindDirText,A0
JSR ShowStatusText
BSR SetErrorPtrCol
MOVEQ #-1,D0
RTS
ClearDirTotal
CLR.W 16(A5)
RTS
CantFindDirText dc.b "can't find dir !",0,0
NewDirEntry
LEA FIB_FileName,A0
TST.B ShowDirsFlag
BNE.S ndeok1
TST.L FIB_EntryType
BPL Return1
ndeok1 TST.L FIB_EntryType
BPL ndeok2
TST.B ModOnlyFlag
BEQ.S ndeok2
TST.W DirPathNum
BNE.S ndeok2
MOVE.L (A0),D0
AND.L #$CFCFCFCF,D0
CMP.L #$4D4F440E,D0 ; MOD.
BNE Return1
ndeok2 MOVE.W 16(A5),D0
CMP.W DirEntries,D0
BLO.S ndeok3
MOVE.L A0,-(SP)
BSR AllocDirMem
MOVE.L (SP)+,A0
ndeok3 MOVE.W 16(A5),D6
BEQ.S ndeadd1 ; If first entry
SUBQ.W #1,D6
MOVE.L (A5),A1
ndeloopname
MOVEQ #0,D2
MOVE.L FIB_EntryType,D0
MOVE.L 32(A1),D1
TST.L D0
BPL.S ndesfil ; if directory, all is well
TST.L D1
BMI.S ndenext ; was file, so skip if directory
BRA.S ndelopc
ndesfil TST.L D1 ; if file
BPL.S ndeinse
ndelopc MOVE.B (A0,D2.W),D0 ; Get a character
BEQ.S ndeinse
CMP.B #96,D0 ; Lowercase?
BLO.S ndeskp1
SUB.B #32,D0 ; Switch to upper
ndeskp1 MOVE.B (A1,D2.W),D1
BEQ.S ndenext
CMP.B #96,D1
BLO.S ndeskp2
SUB.B #32,D1
ndeskp2 CMP.B D0,D1
BHI.S ndeinse
BNE.S ndenext
ADDQ.W #1,D2
BRA.S ndelopc
ndenext LEA 36(A1),A1 ; next entry
DBRA D6,ndeloopname ; loop entries
MOVE.L (A5),A1
MOVE.W 16(A5),D0
MULU #36,D0
ADD.W D0,A1
BRA.S ndeadd2
ndeinse MOVE.L (A5),A2
MOVE.W 16(A5),D0
MULU #36,D0
ADD.W D0,A2
MOVE.L A2,A3
LEA 36(A3),A3
nde3loop
MOVE.W -(A2),-(A3)
CMP.L A2,A1
BNE.S nde3loop
BRA.S ndeadd2
ndeadd1 MOVE.L (A5),A1 ; Put new filename into list
ndeadd2 LEA FIB_FileName,A0
MOVE.L A1,A3
MOVEQ #35,D0 ; Clear old filename
nde4loop
CLR.B (A3)+
DBRA D0,nde4loop
MOVE.W FIB_DateStamp+ds_Days+2,30(A1)
MOVEQ #-1,D0
TST.L FIB_EntryType
BPL ndefskp
MOVE.L FIB_FileSize,D0
ndefskp MOVE.L D0,32(A1)
MOVEQ #29,D0 ; Copy new filename
nde4loop2
MOVE.B (A0)+,D1
MOVE.B D1,(A1)+
TST.B D1
BEQ.S nde4skip
DBRA D0,nde4loop2
nde4skip
ADDQ.W #1,16(A5) ; Files + 1
RTS
RedrawFileNames
MOVE.W D0,-(SP)
BSR ShowDirPath
MOVE.W (SP)+,D0
MOVE.W D0,FileNameScrollPos
TST.W 16(A5)
BEQ Return1
MOVE.L #1881,A6
MOVE.W A6,TextOffset
MOVE.L (A5),D6
MULU #36,D0
ADD.L D0,D6
MOVE.W 16(A5),D0
SUB.W FileNameScrollPos,D0
CMP.W #8,D0
BHS.S ShowFileNames
SUBQ.W #1,D0
MOVE.W D0,D7
BRA.S sfnloop
ShowFileNames
MOVE.W #$91,D0
BSR WaitForVBlank
MOVEQ #7,D7
sfnloop MOVE.W A6,TextOffset
MOVE.L D6,A0
MOVEQ #0,D0
MOVE.W 30(A0),D0
BSR CalculateDate
MOVE.W TheDay(PC),WordNumber
JSR Print2DecDigits
MOVE.W TheMonth(PC),WordNumber
JSR Print2DecDigits
MOVE.W TheYear(PC),WordNumber
JSR Print2DecDigits
ADDQ.W #1,TextOffset
MOVE.L D6,ShowTextPtr
MOVE.W #24,TextLength
TST.W DirPathNum
BNE.S sfnskip
TST.B ModOnlyFlag
BEQ.S sfnskip
MOVE.L D6,A0
CMP.L #"mod.",(A0)
BNE.S sfnskip
ADDQ.L #4,ShowTextPtr
sfnskip JSR SpaceShowText
LEA 32(A6),A6
MOVE.W A6,TextOffset
MOVE.L D6,A0
MOVE.L 32(A0),D1
BMI.S sfndir
TST.B ShowDecFlag
BNE.S sfndec
SWAP D1
AND.W #$000F,D1
BSR ShowOneDigit
MOVE.L D6,A0
MOVE.W 34(A0),WordNumber
JSR PrintHexWord
sfnend ADD.L #36,D6
LEA 208(A6),A6
DBRA D7,sfnloop
RTS
sfndec MOVE.L D1,D0
SUBQ.W #1,TextOffset
JSR Print6DecDigits
BRA.S sfnend
sfndir MOVE.L #DirText,ShowTextPtr
SUBQ.W #1,TextOffset
MOVE.W #6,TextLength
JSR ShowText
BRA.S sfnend
ClrFileText dc.b " "
CalculateDate
DIVU #1461,D0
LSL.W #2,D0
MOVE.W D0,TheYear
CLR.W D0
SWAP D0
CMP.W #789,D0
BEQ.S cadleap
BLO.S cadskp2
SUBQ.W #1,D0
cadskp2 DIVU #365,D0
MOVE.L D0,D1
SWAP D1
CMP.W #4,D0
BLO.S cadskip
SUBQ.W #1,D0
cadskip ADD.W D0,TheYear
LEA MonthTable(PC),A1
MOVEQ #24,D0
cadloop SUBQ.W #2,D0
MOVE.W (A1,D0.W),D2
CMP.W D2,D1
BHS.S cadskp3
TST.W D0
BNE.S cadloop
cadskp3 LSR.W #1,D0
ADDQ.W #1,D0
MOVE.W D0,TheMonth
SUB.W D2,D1
ADDQ.W #1,D1
MOVE.W D1,TheDay
cadend MOVEQ #0,D0
MOVE.W TheYear(PC),D0
ADD.W #78,D0
DIVU #100,D0
SWAP D0
MOVE.W D0,TheYear
RTS
cadleap ADD.W #2,TheYear
MOVE.W #2,TheMonth
MOVE.W #29,TheDay
BRA cadend
TheYear dc.w 0
TheMonth dc.w 0
TheDay dc.w 0
MonthTable dc.w 0,31,59,90,120,151,181,212,243,273,304,334
DirText dc.b " (DIR)"
;---- Play Song ----
PlaySong
MOVEQ #0,D0
SongFrom
BSR StopIt
BTST #2,$DFF016
BNE.S sofr1
MOVE.W PlayFromPos,D0
sofr1 MOVE.W D0,ScrPattPos
LSL.W #4,D0
AND.L #$FFFF,D0
MOVE.L D0,PatternPosition
wfbu1 BTST #6,$BFE001
BEQ.S wfbu1
CLR.B RawKeyCode
CLR.B SaveKey
BSR SetPlayPtrCol
CLR.W PatternTicks
CLR.L TimerTicks
MOVE.L #'patp',RunMode
CLR.W DidQuantize
MOVE.L #-1,LongFFFF
BSR SetScrPatternPos
SetPlayPosition
MOVE.L CurrPos,D0
MOVE.L SongDataPtr,A0
CMP.B sd_numofpatt(A0),D0
BHS.S SongPosToZero
MOVE.L CurrPos,SongPosition
RTS
SongPosToZero
CLR.L SongPosition
CLR.L CurrPos
RTS
;---- Play Pattern ----
PlayPattern
MOVEQ #0,D0
PattFrom
BSR StopIt
BTST #2,$DFF016
BNE.S pafr1
MOVE.W PlayFromPos,D0
pafr1 MOVE.W D0,ScrPattPos
LSL.W #4,D0
AND.L #$FFF,D0
MOVE.L D0,PatternPosition
wfbu2 BTST #6,$BFE001
BEQ.S wfbu2
CLR.B RawKeyCode
CLR.B SaveKey
MOVE.L #'patt',RunMode
BSR SetPlayPtrCol
ResetPosition
MOVE.L PatternNumber,SongPosition
RTS
;---- Record Pattern/Song ----
RecordPattern
MOVEQ #0,D0
RecordFrom
TST.W SamScrEnable
BNE Return1
BSR StopIt
BTST #2,$DFF016
BNE.S refr1
MOVE.W PlayFromPos,D0
refr1 MOVE.W D0,ScrPattPos
LSL.W #4,D0
AND.L #$FFF,D0
MOVE.L D0,PatternPosition
wfbu3 BTST #6,$BFE001
BEQ.S wfbu3
BSR SetEditPtrCol
CLR.B RawKeyCode
CLR.B SaveKey
BSR SaveUndo
MOVE.L #'edit',EditMode
MOVE.L #'patt',RunMode
TST.B RecordMode
BEQ.S ResetPosition
MOVE.L #'patp',RunMode
BRA SetPlayPosition
;---- Show Main Screen ----
DisplayMainScreen
CLR.W BlockMarkFlag
MOVE.W #1,CurrScreen
SF NoSampleInfo
TST.W LoadInProgress
BNE.S dmsskp3
BSR SetNormalPtrCol
TST.W RunMode
BEQ.S dmsskip
BSR SetPlayPtrCol
dmsskip TST.L EditMode
BEQ.S dmsskp2
BSR SetEditPtrCol
dmsskp2 BSR StorePtrCol
dmsskp3 ST DisableAnalyzer
BSR ClearAnaHeights
BSR ClearRightArea
LEA TopMenusPos,A0
LEA TopMenusBuffer,A1
MOVEQ #43,D0
cgloop4 MOVEQ #24,D1
cgloop5 MOVE.B (A1)+,(A0)+
MOVE.B 1099(A1),10239(A0)
DBRA D1,cgloop5
LEA 15(A0),A0
DBRA D0,cgloop4
BSR RedrawToggles
TST.B EdEnable
BNE EditOp
MOVEQ #0,D4
RedrawAnaScope
MOVE.W #145,D0
BSR WaitForVBlank
SF ScopeEnable
ST DisableAnalyzer
BSR ClearRightArea
LEA SpectrumAnaData,A0
MOVE.L #SpectrumAnaSize,D0
TST.B AnaScopFlag
BEQ.S cgjojo
LEA ScopeData,A0
MOVE.L #ScopeSize,D0
cgjojo BSR Decompact
BEQ cgjaja
LEA SpectrumAnaPos,A0
MOVEQ #1,D7
cgloop1 MOVEQ #54,D6 ; 55 lines in picture.
cgloop2 MOVEQ #24,D5 ; 25 bytes(x8)
cgloop3 MOVE.B (A1)+,(A0)+
DBRA D5,cgloop3
ADDQ.L #1,A1
LEA 15(A0),A0
DBRA D6,cgloop2
LEA $1F68(A0),A0
DBRA D7,cgloop1
BSR FreeDecompMem
cgjaja TST.L D4
BNE Return1
TST.B AnaScopFlag
BNE cgscope
BSR ClearAnaHeights
BSR ClearRightArea
SF DisableAnalyzer
BRA SetAnalyzerColors
cgscope ST ScopeEnable
BRA ClearAnalyzerColors
;---- Clear Areas ----
ClearFileNames MOVE.W #145,D0
BSR WaitForVBlank
MOVE.L TextBplPtr,A1
LEA 1800(A1),A1
MOVE.W #549,D0
MOVEQ #0,D1
cfnloop MOVE.L D1,(A1)+
DBRA D0,cfnloop
RTS
ClearRightArea
MOVE.L TextBplPtr,A0
LEA 55(A0),A0
MOVEQ #0,D2
MOVEQ #98,D0
cnblloop1
MOVEQ #24,D1
cnblloop2
MOVE.B D2,(A0)+
DBRA D1,cnblloop2
LEA 15(A0),A0
DBRA D0,cnblloop1
RTS
Clear100Lines
MOVE.L TextBplPtr,A0
MOVE.W #999,D0
MOVEQ #0,D1
chlloop MOVE.L D1,(A0)+
DBRA D0,chlloop
RTS
;---- Are You Sure Requester ----
AreYouSure
MOVE.B DisableAnalyzer,SaveDA
MOVE.B ScopeEnable,SaveScope
SF ScopeEnable
JSR ShowStatusText
BSR StorePtrCol
BSR SetWaitPtrCol
BSR Wait_4000
CMP #1,CurrScreen
BNE.S aysskip
TST.B DisableAnalyzer
BNE.S aysskip
ST DisableAnalyzer
BSR ClearAnaHeights
BSR ClearRightArea
aysskip LEA SureBoxData,A1
BSR SwapBoxMem
BSR WaitForButtonUp
BSR Wait_4000
CLR.B RawKeyCode
surebuttoncheck
BTST #2,$DFF016
BEQ.S SureAnswerNo
BSR DoKeyBuffer
MOVE.B RawKeyCode,D0
CMP.B #21,D0 ; Pressed Y
BEQ SureAnswerYes
CMP.B #68,D0 ; Pressed Return
BEQ.S SureAnswerYes
CMP.B #54,D0 ; Pressed N
BEQ.S SureAnswerNo
CMP.B #69,D0 ; Pressed Esc
BEQ.S SureAnswerNo
BTST #6,$BFE001 ; Left Mousebutton
BNE.S surebuttoncheck
MOVEM.W MouseX,D0/D1
CMP.W #$AB,D0
BLO.S surebuttoncheck
CMP.W #$FC,D0
BHI.S surebuttoncheck
CMP.W #$48,D1
BLO.S surebuttoncheck
CMP.W #$52,D1
BHI.S surebuttoncheck
CMP.W #$C5,D0
BLO.S SureAnswerYes
CMP.W #$EA,D0
BLO.S surebuttoncheck
SureAnswerNo
LEA SureBoxData,A1
BSR.S SwapBoxMem
JSR ShowAllRight
BSR ClearAnaHeights
MOVE.B SaveDA,DisableAnalyzer
MOVE.B SaveScope,ScopeEnable
BSR ErrorRestoreCol
BSR WaitForButtonUp
BSR Wait_4000
CLR.B RawKeyCode
MOVEQ #-1,D0
RTS
SureAnswerYes
LEA SureBoxData,A1
BSR.S SwapBoxMem
JSR ShowAllRight
BSR ClearAnaHeights
MOVE.B SaveDA,DisableAnalyzer
MOVE.B SaveScope,ScopeEnable
BSR RestorePtrCol
BSR WaitForButtonUp
BSR Wait_4000
CLR.B RawKeyCode
MOVEQ #0,D0
RTS
SwapBoxMem
LEA SureBoxPos,A0
MOVEQ #38,D0
ssbmloop1
MOVEQ #12,D1
ssbmloop2
MOVE.B 10240(A0),D2
MOVE.B 546(A1),10240(A0)
MOVE.B D2,546(A1)
MOVE.B (A0),D2
MOVE.B (A1),(A0)+
MOVE.B D2,(A1)+
DBRA D1,ssbmloop2
LEA $001B(A0),A0
ADDQ.L #1,A1
DBRA D0,ssbmloop1
MOVE.L TextBplPtr,A0 ; Swap text...
LEA 2100(A0),A0
LEA TextDataBuffer,A1
MOVEQ #38,D0
ssbmloop3
MOVEQ #12,D1
ssbmloop4
MOVE.B (A0),D2
MOVE.B (A1),(A0)+
MOVE.B D2,(A1)+
DBRA D1,ssbmloop4
LEA $001B(A0),A0
ADDQ.L #1,A1
DBRA D0,ssbmloop3
RTS
WaitForButtonUp
BTST #6,$BFE001 ; Check Left Mousebutton
BEQ.S WaitForButtonUp
BTST #2,$DFF016 ; Check Right Mousebutton
BEQ.S WaitForButtonUp
MOVE.W #$91,D0
WaitForVBlank
MOVE.L $DFF004,D1
LSR.L #8,D1
AND.W #$1FF,D1
CMP.W D1,D0
BNE.S WaitForVBlank
RTS
;---- Set Pointercolors ----
SetDeletePtrCol
MOVE.L A6,-(SP)
MOVE.L CopListColorPtr,A6
MOVE.W #$0AA,2(A6)
MOVE.W #$077,6(A6)
MOVE.W #$044,10(A6)
MOVE.L (SP)+,A6
RTS
SetNormalPtrCol
MOVE.L A6,-(SP)
MOVE.L CopListColorPtr,A6
MOVE.W #$AAA,2(A6)
MOVE.W #$777,6(A6)
MOVE.W #$444,10(A6)
MOVE.L (SP)+,A6
RTS
SetDiskPtrCol
MOVE.L A6,-(SP)
MOVE.L CopListColorPtr,A6
MOVE.W #$0A0,2(A6)
MOVE.W #$070,6(A6)
MOVE.W #$040,10(A6)
MOVE.L (SP)+,A6
RTS
SetPlayPtrCol
MOVE.L A6,-(SP)
MOVE.L CopListColorPtr,A6
MOVE.W #$AA0,2(A6)
MOVE.W #$770,6(A6)
MOVE.W #$440,10(A6)
MOVE.L (SP)+,A6
RTS
SetEditPtrCol
MOVE.L A6,-(SP)
MOVE.L CopListColorPtr,A6
MOVE.W #$05B,2(A6)
MOVE.W #$049,6(A6)
MOVE.W #$006,10(A6)
MOVE.L (SP)+,A6
RTS
SetWaitPtrCol
MOVE.L A6,-(SP)
MOVE.L CopListColorPtr,A6
MOVE.W #$A5A,2(A6)
MOVE.W #$727,6(A6)
MOVE.W #$404,10(A6)
MOVE.L (SP)+,A6
RTS
SetErrorPtrCol
MOVE.L A6,-(SP)
MOVE.L CopListColorPtr,A6
MOVE.W #$C00,2(A6)
MOVE.W #$900,6(A6)
MOVE.W #$700,10(A6)
MOVE.L (SP)+,A6
MOVE.W #1,UpdateFreeMem
BSR WaitALittle
JSR ShowAllRight
BSR SetNormalPtrCol
MOVEQ #0,D0
RTS
WaitALittle
MOVE.W WaitTime(PC),D1
errorwaitloop
BSR Wait_4000
DBRA D1,errorwaitloop
MOVE.W #23,WaitTime
RTS
WaitTime dc.w 23
StorePtrCol
MOVE.L A6,-(SP)
MOVE.L CopListColorPtr,A6
MOVE.W 2(A6),PointerCol1Save
MOVE.W 6(A6),PointerCol2Save
MOVE.W 10(A6),PointerCol3Save
MOVE.L (SP)+,A6
RTS
ErrorRestoreCol
BSR SetErrorPtrCol
RestorePtrCol
MOVE.L A6,-(SP)
MOVE.W #1,UpdateFreeMem
MOVE.L CopListColorPtr,A6
MOVE.W PointerCol1Save,2(A6)
MOVE.W PointerCol2Save,6(A6)
MOVE.W PointerCol3Save,10(A6)
MOVE.L (SP)+,A6
RTS
;---- Check special keys ----
CheckPlayKeys
MOVE.B RawKeyCode,D0
CMP.B #101,D0
BEQ PlaySong
CMP.B #103,D0
BEQ PlayPattern
CMP.B #64,D0
BNE.S cpkskip
TST.L RunMode
BNE StopIt
TST.L EditMode
BNE StopIt
BRA Edit
cpkskip CMP.B #97,D0
BEQ RecordPattern
CMP.B #69,D0
BEQ EscPressed
CMP.B #66,D0
BEQ TabulateCursor
CMP.B #127,D0
BEQ GotoCLI
CMP.B #48,D0
BEQ TurnOffVoices
CMP.B #60,D0
BEQ KillSample
CMP.B #13,D0
BEQ togglepnote
CMP.B #67,D0
BEQ.S HigherInstr
CMP.B #67+128,D0
BEQ.S LowerInstr
MOVE.W HiLowInstr,D1
LEA kpinstable(PC),A0
MOVEQ #0,D2
kpinsloop
CMP.B (A0,D2.W),D0
BEQ.S kpinsfound
ADDQ.W #1,D2
CMP.W #16,D2
BLO.S kpinsloop
RTS
kpinsfound
ADD.W D2,D1
BEQ.S insnull
BRA.S redrsa2
LowerInstr
CLR.W HiLowInstr
RTS
HigherInstr
MOVE.W #16,HiLowInstr
MOVE.W #16,D1
BRA.S redrsa2
redrsa3 MOVE.W D1,InsNum
redrsam CLR.B RawKeyCode
CLR.L SavSamInf
JSR ShowSampleInfo
JMP RedrawSample
insnull TST.W InsNum
BEQ.S insnul2
MOVE.W InsNum,LastInsNum
CLR.W InsNum
MOVEQ #0,D1
BRA.S redrsa2
insnul2 JMP ShowSampleInfo
kpinstable
dc.b 15,90,91,92
dc.b 93,61,62,63,74
dc.b 45,46,47,94,29,30
dc.b 31
redrsa2 TST.B pnoteflag
BEQ.S redrsa3
CLR.B RawKeyCode
TST.W AltKeyStatus
BNE.S setpnote
MOVE.W D1,InsNum
JSR ShowSampleInfo
MOVE.W InsNum,D0
ADD.W D0,D0
MOVE.W pnotetable(PC,D0.W),D0
MOVEQ #-1,D2
BSR playtheinstr
JMP RedrawSample
pnotetable
dc.w 24,24,24,24,24,24,24,24,24,24
dc.w 24,24,24,24,24,24,24,24,24,24
dc.w 24,24,24,24,24,24,24,24,24,24
dc.w 24,24
setpnote
ADD.W D1,D1
LEA pnotetable(PC,D1.W),A0
MOVE.L A0,SplitAddress
MOVE.W #4,SamNoteType
LEA selnotetext(PC),A0
JMP ShowStatusText
selnotetext dc.b "select note",0
togglepnote
CLR.B RawKeyCode
MOVEQ #0,D0
MOVE.B pnoteflag,D0
ADDQ.B #1,D0
CMP.B #3,D0
BLO.S tpnskp
MOVEQ #0,D0
tpnskp MOVE.B D0,pnoteflag
LEA pnotechar(PC,D0.W),A0
MOVEQ #1,D0
MOVE.W #5159,D1
JMP ShowText3
pnotechar dc.b 32,128,129
pnoteflag dc.b 0
;---- Check transpose keys ----
CheckTransKeys
TST.W LeftAmigaStatus
BEQ Return1
MOVE.W PattCurPos,D0
BSR GetPositionPtr
MOVE.B RawKeyCode,D1
CLR.B RawKeyCode
MOVE.B SampleAllFlag,-(SP)
BSR.S ctksub
MOVE.B (SP)+,SampleAllFlag
RTS
ctksub MOVEQ #0,D0
CLR.B SampleAllFlag
CMP.B #1,D1
BEQ NoteUp
CMP.B #16,D1
BEQ NoteDown
CMP.B #32,D1
BEQ OctaveUp
CMP.B #49,D1
BEQ OctaveDown
MOVE.W #300,D0
CMP.B #2,D1
BEQ NoteUp
CMP.B #17,D1
BEQ NoteDown
CMP.B #33,D1
BEQ OctaveUp
CMP.B #50,D1
BEQ OctaveDown
MOVEQ #0,D0
MOVE.B #1,SampleAllFlag
CMP.B #3,D1
BEQ NoteUp
CMP.B #18,D1
BEQ NoteDown
CMP.B #34,D1
BEQ OctaveUp
CMP.B #51,D1
BEQ OctaveDown
MOVE.W #300,D0
CMP.B #4,D1
BEQ NoteUp
CMP.B #19,D1
BEQ NoteDown
CMP.B #35,D1
BEQ OctaveUp
CMP.B #52,D1
BEQ OctaveDown
RTS
;---- Check control keys ----
CheckCtrlKeys
TST.W CtrlKeyStatus
BEQ Return1
MOVEQ #0,D0
MOVE.B RawKeyCode,D0
CMP.B #35,D0 ; F
BEQ ToggleFilter
CMP.B #33,D0 ; S
BEQ ToggleSplit
CMP.B #55,D0 ; M
BEQ ToggleMultiMode
CMP.B #16,D0 ; Q
BEQ UnmuteAll
CMP.B #32,D0 ; A
BEQ ToggleMute
CMP.B #49,D0 ; Z
BEQ RestoreEffects
CMP.B #19,D0 ; R
BEQ RestoreFKeyPos
CMP.B #20,D0 ; T
BEQ SwapTrack
CMP.B #53,D0 ; B
BEQ BeginBlock
CMP.B #51,D0 ; C
BEQ CopyBlock
CMP.B #50,D0 ; X
BEQ CutBlock
CMP.B #34,D0 ; D
BEQ DeleteBlock
CMP.B #25,D0 ; P
BEQ PasteBlock
CMP.B #23,D0 ; I
BEQ InsertBlock
CMP.B #38,D0 ; J
BEQ JoinPasteBlock
CMP.B #54,D0 ; N
BEQ Re_MarkBlock
CMP.B #21,D0 ; Y
BEQ BackwardsBlock
CMP.B #17,D0 ; W
BEQ PolyphonizeBlock
CMP.B #18,D0 ; E
BEQ ExpandTrack
CMP.B #24,D0 ; O
BEQ ContractTrack
CMP.B #37,D0 ; H
BEQ TransBlockUp
CMP.B #40,D0 ; L
BEQ TransBlockDown
CMP.B #39,D0 ; K
BEQ KillToEndOfTrack
CMP.B #22,D0 ; U
BEQ UndoLastChange
CMP.B #68,D0 ; CR
BEQ InsCmdTrack
CMP.B #65,D0 ; Del
BEQ DelCmdTrack
CMP.B #36,D0 ; G
BEQ BoostAll
CMP.B #52,D0 ; V
BEQ FilterAll
CMP.B #1,D0
BLO Return1
CMP.B #10,D0
BHI Return1
BNE.S cckskip
MOVEQ #0,D0
cckskip MOVE.W D0,EditMoveAdd
CLR.B RawKeyCode
ADD.B #'0',D0
LEA ematext(PC),A0
MOVE.B D0,11(A0)
JSR ShowStatusText
MOVE.W #10,WaitTime
BSR WaitALittle
JMP ShowAllRight
ematext dc.b "editskip = 0",0,0
;---- Check alt keys ----
CheckAltKeys
TST.W AltKeyStatus
BEQ Return1
MOVEQ #0,D0
MOVE.B RawKeyCode,D0
CMP.B #49,D0 ; Z
BEQ ToggleCh1
CMP.B #50,D0 ; X
BEQ ToggleCh2
CMP.B #51,D0 ; C
BEQ ToggleCh3
CMP.B #52,D0 ; V
BEQ ToggleCh4
CMP.B #53,D0 ; B
BEQ Boost
CMP.B #35,D0 ; F
BEQ Filter
CMP.B #20,D0 ; T
BEQ.S xTuningTone
CMP.B #33,D0 ; S
BEQ.S xSamplerScreen
CMP.B #19,D0 ; R
BEQ.S xResample
CMP.B #18,D0 ; E
BEQ DoEditOp
CMP.B #23,D0 ; I
BEQ.S AutoInsert
CMP.B #34,D0 ; D
BEQ DiskOp
CMP.B #39,D0 ; K
BEQ KillInstrTrack
; CMP.B #17,D0 ; W
; BEQ.S WaitForNote
CMP.B #32,D0 ; A
BEQ.S xSampler
CMP.B #16,D0 ; Q
BEQ ChkQuit
CMP.B #21,D0 ; Y
BEQ SaveAllSamples
; CMP.B #24,D0 ; O
; CMP.B #55,D0 ; M
; CMP.B #25,D0 ; P
; CMP.B #38,D0 ; J
; CMP.B #54,D0 ; N
; CMP.B #37,D0 ; H
; CMP.B #40,D0 ; L
; CMP.B #22,D0 ; U
; CMP.B #36,D0 ; G
RTS
xTuningTone JMP TuningTone
xSamplerScreen JMP SamplerScreen
xResample JMP Resample
xSampler JMP Sampler
AutoInsert
CLR.B RawKeyCode
EOR.B #1,AutoInsFlag
ShowAutoInsert
CMP.W #4,CurrScreen
BEQ Return1
MOVE.B #' ',D0
TST.B AutoInsFlag
BEQ.S auins2
MOVE.B #'I',D0
auins2 MOVE.B D0,AutoInsText
MOVE.W #4561,D1
MOVEQ #1,D0
LEA AutoInsText(PC),A0
JMP ShowText3
AutoInsText dc.b 0
AutoInsFlag dc.b 0
SaveAllSamples
LEA SaveAllSamplesText,A0
BSR AreYouSure
BNE SetErrorPtrCol
MOVE.W InsNum,SaveInstr
MOVE.W #1,InsNum
.loop JSR ShowSampleInfo
BSR dosavesample
ADDQ.W #1,InsNum
CMP.W #32,InsNum
BLO.S .loop
MOVE.W SaveInstr,InsNum
JMP ShowSampleInfo
SaveAllSamplesText
dc.b "save all samples?",0
even
;---- Jump between channels ----
TabulateCursor
CLR.B RawKeyCode
TST.W ShiftKeyStatus
BNE.S TabCurRight
MOVE.W PattCurPos,D0
DIVU #6,D0
ADDQ.W #1,D0
CMP.W #4,D0
BNE.S tacskip
MOVEQ #0,D0
tacskip MULU #6,D0
MOVE.W D0,PattCurPos
BRA UpdateCursorPos
TabCurRight
MOVE.W PattCurPos,D0
ADDQ.W #5,D0
DIVU #6,D0
SUBQ.W #1,D0
BPL.S tacskip
MOVEQ #3,D0
BRA.S tacskip
;---- Escape was pressed ----
EscPressed
CLR.B RawKeyCode
CLR.B SaveKey
MOVE.W CurrScreen,D0
CMP.W #2,D0
BLO.S BotExit
TopExit MOVE.W CurrScreen,D0
CMP.W #2,D0
BEQ ExitHelpScreen
CMP.W #3,D0
BEQ ExitFromDir
CMP.W #4,D0
BEQ.S pedexit
CMP.W #5,D0
BEQ ExitSetup
CMP.W #6,D0
BEQ.S plstexit
CMP.W #7,D0
BEQ ExitSetup
RTS
BotExit TST.W SamScrEnable
BNE.S samplerexit
TST.W BlockMarkFlag
BNE blkunma
CMP.W #1,CurrScreen
BNE Return1
TST.B EdEnable
BNE ExitEditOp
RTS
samplerexit
JMP ExitFromSam
pedexit JMP PED_Exit
plstexit JMP ExitPLST
GotoCLI CLR.B RawKeyCode
CLR.B SaveKey
TST.L RunMode
BNE.S cliskp1
BSR StopIt
BSR ResetMusicInt
cliskp1 BSR ResetVBInt
BSR ResetInputHandler
BSR ResetAutoReq
BSR ResetCopList
MOVE.L ExtCmdAddress,D1
BEQ.S gcliskp
CLR.L ExtCmdAddress
MOVE.L ExtCmdWindow,D2
MOVEQ #0,D3
MOVE.L DOSBase,A6
JSR LVOExecute(A6)
gcliskp SUB.L A0,A0
LEA BackToProText(PC),A1
LEA OKGadgetText(PC),A2
MOVE.L A2,A3
MOVEQ #0,D0
MOVEQ #0,D1
MOVE.W #196,D2
MOVEQ #50,D3
MOVE.L IntuitionBase,A6
JSR LVOAutoRequest(A6)
ADDQ.B #1,LastRawkey
TST.L RunMode
BNE.S cliskp2
BSR SetMusicInt
cliskp2 BSR SetVBInt
BSR SetInputHandler
BSR SetAutoReq
BRA SetCopList
BackToProText
dc.b 0,1,1,0
dc.w 14,6
dc.l 0,btptext,0
btptext dc.b 'Back to Protracker',0,0
OKGadgetText
dc.b 0,1,1,0
dc.w 6,3
dc.l 0,okgtext,0
okgtext dc.b 'OK',0,0
;---- Check Help Key ----
HelpSelectText dc.b '* help selected *',0
PLSTSelectText dc.b '* plst selected *',0
PLSTHelpFlag dc.b 0,0 ; free 0
CheckHelpKey
CMP.B #95,RawKeyCode ; Help Key pressed ?
BNE Return1
CLR.B RawKeyCode
TST.W ShiftKeyStatus
BEQ.S realhlp
LEA HelpSelectText,A0
EOR.B #1,PLSTHelpFlag
BEQ.S chksel
LEA PLSTSelectText,A0
chksel BSR ShowStatusText
BSR WaitALittle
BRA ShowAllRight
gtoPLST JMP PLST
realhlp TST.B PLSTHelpFlag
BNE.S gtoPLST
CMP.W #2,CurrScreen
BEQ ExitHelpScreen
BSR TopExit
MOVE.W CurrScreen,SaveCurrScreen
SF ScopeEnable
ST DisableAnalyzer
ST NoSampleInfo
BSR ClearAnalyzerColors
BSR SwapHelpScreen
BEQ exithlp
BSR Clear100Lines
TST.L HelpTextIndex+4
BNE.S chkskip
BSR GetHelpIndex
chkskip MOVE.L #HelpFileName,D1
MOVE.L #1005,D2
MOVE.L DOSBase,A6
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BNE ShowHelpPage
LEA PTPath,A0
BSR CopyPath
LEA HelpFileName(PC),A0
MOVEQ #7,D0
hefilop MOVE.B (A0)+,(A1)+
DBRA D0,hefilop
MOVE.L #FileName,D1
MOVE.L #1005,D2
MOVE.L DOSBase,A6
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BEQ HelpFileError
BRA.S ShowHelpPage
ExitHelpScreen
MOVE.L FileHandle,D1
BEQ.S ehsskip
MOVE.L DOSBase,A6
JSR LVOClose(A6)
ehsskip BSR Clear100Lines
BSR.S SwapHelpScreen
exithlp MOVE.W SaveCurrScreen,CurrScreen
BRA DisplayMainAll
SwapHelpScreen
MOVE.L DecompMemPtr,D0
BEQ.S shelps2
MOVE.L D0,A1
BSR ssets3
BRA FreeDecompMem
shelps2 LEA HelpScreenData,A0
MOVE.L #HelpScreenSize,D0
BSR Decompact
BEQ Return1
BRA ssets3
ShowHelpPage
MOVE.W #2,CurrScreen
MOVE.W HelpPage,D0
AND.W #$00FF,D0
LSL.W #2,D0
LEA HelpTextIndex,A0
MOVE.L FileHandle,D1
BEQ Return1
MOVE.L (A0,D0.W),D2
ADD.L #1024,D2
MOVEQ #-1,D3
MOVE.L DOSBase,A6
JSR LVOSeek(A6)
MOVE.L FileHandle,D1
MOVE.L #HelpTextData,D2
MOVE.L #656,D3
JSR LVORead(A6)
BSR Clear100Lines
LEA HelpTextData+16,A6
MOVEQ #120,D6
MOVEQ #15,D7
shploop MOVEQ #0,D0
MOVE.L A6,A1
shplop2 CMP.B #10,(A1)+
BEQ.S ShowHelpLine
TST.B -1(A1)
BEQ.S ShowHelpLine
ADDQ.W #1,D0
BRA.S shplop2
ShowHelpLine
MOVE.L A6,ShowTextPtr
MOVE.L A1,A6
MOVE.W D6,TextOffset
MOVE.W D0,TextLength
BEQ.S shlskip
JSR ShowText
shlskip ADD.W #240,D6
DBRA D7,shploop
BSR Wait_4000
BRA Wait_4000
HelpPage dc.w 1
HelpUp LEA HelpTextData+7,A0
BRA.S HelpMove
HelpDown
LEA HelpTextData+10,A0
BRA.S HelpMove
HelpLeft
LEA HelpTextData+4,A0
BRA.S HelpMove
HelpRight
LEA HelpTextData+13,A0
HelpMove
CLR.B RawKeyCode
MOVEQ #0,D0
JSR HexToInteger2
TST.W D0
BEQ Return1
AND.W #$00FF,D0
MOVE.W D0,HelpPage
BRA ShowHelpPage
GetHelpIndex
MOVE.L LaHeTx,D0
CMP.L HelpTextIndex,D0
BEQ Return1
MOVE.L #HelpFileName,D1
MOVE.L #1005,D2
MOVE.L DOSBase,A6
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BNE.S gehein
LEA PTPath,A0
BSR CopyPath
LEA HelpFileName(PC),A0
MOVEQ #7,D0
hefilp2 MOVE.B (A0)+,(A1)+
DBRA D0,hefilp2
MOVE.L #FileName,D1
MOVE.L #1005,D2
MOVE.L DOSBase,A6
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BEQ.S HelpFileError
gehein MOVE.L D0,D1
MOVE.L #HelpTextIndex,D2
MOVE.L #256*4,D3
JSR LVORead(A6)
MOVE.L FileHandle,D1
JSR LVOClose(A6)
MOVE.L HelpTextIndex,LaHeTx
RTS
HelpFileError
MOVE.W #2,CurrScreen
LEA NoHelpText(PC),A0
MOVE.W #1887,D1
MOVEQ #24,D0
JMP ShowText3
NoHelpText dc.b 'Unable to open helpfile!'
HelpFileName dc.b 'PT.help',0
;---- Check Function Keys F6-F10 ----
CheckF6_F10
CMP.B #85,RawKeyCode
BNE.S CheckF7
CLR.B RawKeyCode
TST.W ShiftKeyStatus
BEQ.S cf6skip
MOVE.W ScrPattPos,F6pos
ShowPosSetText
LEA PosSetText,A0
BSR ShowStatusText
MOVEQ #8,D2
spsloop BSR Wait_4000
DBRA D2,spsloop
BRA ShowAllRight
cf6skip MOVE.W F6pos,D0
chkalt TST.W AltKeyStatus
BNE PattFrom
TST.W CtrlKeyStatus
BNE RecordFrom
TST.W LeftAmigaStatus
BNE SongFrom
TST.W RunMode
BNE Return1
MOVE.W D0,ScrPattPos
BRA SetScrPatternPos
CheckF7 CMP.B #86,RawKeyCode
BNE.S CheckF8
CLR.B RawKeyCode
TST.W ShiftKeyStatus
BEQ.S cf7skip
MOVE.W ScrPattPos,F7pos
BRA.S ShowPosSetText
cf7skip MOVE.W F7pos,D0
BRA.S chkalt
CheckF8 CMP.B #87,RawKeyCode
BNE.S CheckF9
CLR.B RawKeyCode
TST.W ShiftKeyStatus
BEQ.S cf8skip
MOVE.W ScrPattPos,F8pos
BRA ShowPosSetText
cf8skip MOVE.W F8pos,D0
BRA chkalt
CheckF9 CMP.B #88,RawKeyCode
BNE.S CheckF10
CLR.B RawKeyCode
TST.W ShiftKeyStatus
BEQ.S cf9skip
MOVE.W ScrPattPos,F9pos
BRA ShowPosSetText
cf9skip MOVE.W F9pos,D0
BRA chkalt
CheckF10
CMP.B #89,RawKeyCode
BNE Return1
CLR.B RawKeyCode
TST.W ShiftKeyStatus
BEQ.S cf10skip
MOVE.W ScrPattPos,F10pos
BRA ShowPosSetText
cf10skip
MOVE.W F10pos,D0
BRA chkalt
F6pos dc.w 0
F7pos dc.w 16
F8pos dc.w 32
F9pos dc.w 48
F10pos dc.w 63
;---- Check Function Keys F3-F5 ----
CheckF3_F5
MOVEQ #0,D0
MOVE.L D0,A0
TST.W ShiftKeyStatus
BNE CCP4
TST.W CtrlKeyStatus
BNE CCP4
TST.W AltKeyStatus
BNE CutCopPas
CMP.B #68,RawKeyCode
BEQ.S StepPlayForward
CMP.B #65,RawKeyCode
BEQ.S StepPlayBackward
TST.W SamScrEnable
BEQ Return1
CMP.B #82,RawKeyCode
BEQ.S xSamCut
CMP.B #83,RawKeyCode
BEQ.S xSamCop
CMP.B #84,RawKeyCode
BEQ.S xSamPas
RTS
xSamCut JMP SamCut
xSamCop JMP SamCopy
xSamPas JMP SamPaste
StepPlayForward
MOVE.W #1,StepPlayEnable
BSR DoStopIt
MOVE.W ScrPattPos,D0
BRA pafr1
StepPlayBackward
MOVE.W #1,StepPlayEnable
BSR DoStopIt
MOVE.W ScrPattPos,D0
SUBQ.W #1,D0
AND.W #63,D0
BRA pafr1
StepPlayEnable dc.w 0
CCP4 MOVEQ #0,D0
MOVE.W PattCurPos,D0
DIVU #6,D0
AND.L #3,D0
LSL.L #2,D0
MOVE.L D0,A0
CutCopPas
ADD.L SongDataPtr,A0
LEA sd_patterndata(A0),A0
MOVE.L PatternNumber,D0
LSL.L #8,D0
LSL.L #2,D0
ADD.L D0,A0
TST.W AltKeyStatus
BNE.S CutCopPasPatt
TST.W CtrlKeyStatus
BNE.S CutCopPasCmds
CutCopPasTrack
CMP.B #82,RawKeyCode
BEQ CutTrack
CMP.B #83,RawKeyCode
BEQ CopyTrack
CMP.B #84,RawKeyCode
BEQ PasteTrack
CMP.B #68,RawKeyCode
BEQ InsNoteTrack
CMP.B #65,RawKeyCode
BEQ DelNoteTrack
RTS
CutCopPasPatt
CMP.B #82,RawKeyCode
BEQ.S CutPattern
CMP.B #83,RawKeyCode
BEQ.S CopyPattern
CMP.B #84,RawKeyCode
BEQ PastePattern
CMP.B #68,RawKeyCode
BEQ InsNotePattern
CMP.B #65,RawKeyCode
BEQ DelNotePattern
RTS
CutCopPasCmds
CMP.B #82,RawKeyCode
BEQ CutCmds
CMP.B #83,RawKeyCode
BEQ CopyCmds
CMP.B #84,RawKeyCode
BEQ PasteCmds
RTS
CutPattern
BSR SaveUndo
LEA PatternBuffer,A1
MOVE.W #255,D0
MOVEQ #0,D1
cupaloop
MOVE.L (A0),(A1)+
MOVE.L D1,(A0)+
DBRA D0,cupaloop
CLR.B RawKeyCode
BRA RedrawPattern
CopyPattern
LEA PatternBuffer,A1
MOVE.W #255,D0
copaloop
MOVE.L (A0)+,(A1)+
DBRA D0,copaloop
CLR.B RawKeyCode
RTS
PastePattern
BSR SaveUndo
LEA PatternBuffer,A1
MOVE.W #255,D0
papaloop
MOVE.L (A1)+,(A0)+
DBRA D0,papaloop
CLR.B RawKeyCode
BRA RedrawPattern
CutTrack
BSR SaveUndo
LEA TrackBuffer,A1
MOVEQ #63,D0
MOVEQ #0,D1
cutrloop
MOVE.L (A0),(A1)+
MOVE.L D1,(A0)
LEA 16(A0),A0
DBRA D0,cutrloop
CLR.B RawKeyCode
BRA RedrawPattern
CopyTrack
LEA TrackBuffer,A1
MOVEQ #63,D0
cotrloop
MOVE.L (A0),(A1)+
LEA 16(A0),A0
DBRA D0,cotrloop
CLR.B RawKeyCode
RTS
PasteTrack
BSR SaveUndo
LEA TrackBuffer,A1
MOVEQ #63,D0
patrloop
MOVE.L (A1)+,(A0)
LEA 16(A0),A0
DBRA D0,patrloop
CLR.B RawKeyCode
BRA RedrawPattern
InsNotePattern
BSR SaveUndo
MOVEQ #0,D0
BSR GetPositionPtr
BSR.S inotr
MOVEQ #6,D0
BSR GetPositionPtr
BSR.S inotr
MOVEQ #12,D0
BSR GetPositionPtr
BSR.S inotr
MOVEQ #18,D0
BSR GetPositionPtr
BSR.S inotr
BRA.S intskip
InsNoteTrack
BSR SaveUndo
BSR.S inotr
intskip CLR.B RawKeyCode
ADD.W D2,ScrPattPos
AND.W #$3F,ScrPattPos
BSR SetScrPatternPos
BRA RedrawPattern
inotr MOVE.W ScrPattPos,D1
LSL.W #4,D1
CMP.W #63*16,D1
BEQ.S inoskip
MOVE.W #992,D0
intloop MOVE.L (A0,D0.W),16(A0,D0.W)
SUB.W #16,D0
CMP.W D1,D0
BGE.S intloop
inoskip MOVEQ #1,D2
CLR.L (A0,D1.W)
RTS
InsCmdTrack
BSR SaveUndo
MOVE.W PattCurPos,D0
BSR GetPositionPtr
BSR.S icmtr
BRA.S intskip
icmtr MOVE.W ScrPattPos,D1
LSL.W #4,D1
CMP.W #63*16,D1
BEQ.S icmskip
MOVE.W #992,D0
icmloop MOVE.W 2(A0,D0.W),D2
AND.W #$0FFF,D2
AND.W #$F000,18(A0,D0.W)
OR.W D2,18(A0,D0.W)
SUB.W #16,D0
CMP.W D1,D0
BGE.S icmloop
icmskip MOVEQ #1,D2
AND.W #$F000,2(A0,D1.W)
RTS
DelNotePattern
BSR SaveUndo
MOVEQ #0,D0
BSR GetPositionPtr
BSR.S dnt
MOVEQ #6,D0
BSR GetPositionPtr
BSR.S dnt
MOVEQ #12,D0
BSR GetPositionPtr
BSR.S dnt
MOVEQ #18,D0
BSR GetPositionPtr
BSR.S dnt
BRA intskip
DelNoteTrack
BSR SaveUndo
BSR.S dnt
BRA intskip
dnt MOVE.W ScrPattPos,D0
BEQ Return1
SUBQ.W #1,D0
LSL.W #4,D0
dntloop MOVE.L 16(A0,D0.W),(A0,D0.W)
ADD.W #16,D0
CMP.W #1024,D0
BLO.S dntloop
MOVE.W #1008,D1
MOVEQ #-1,D2
CLR.L (A0,D1.W)
RTS
DelCmdTrack
BSR SaveUndo
MOVE.W PattCurPos,D0
BSR GetPositionPtr
BSR.S dct
BRA intskip
dct MOVE.W ScrPattPos,D0
BEQ Return1
SUBQ.W #1,D0
LSL.W #4,D0
dctloop MOVE.W 18(A0,D0.W),D2
AND.W #$0FFF,D2
AND.W #$F000,2(A0,D0.W)
OR.W D2,2(A0,D0.W)
ADD.W #16,D0
CMP.W #1024,D0
BLO.S dctloop
MOVE.W #1008,D1
MOVEQ #-1,D2
AND.W #$F000,2(A0,D1.W)
RTS
CutCmds BSR SaveUndo
LEA CmdsBuffer,A1
CLR.W D0
cucmloop
MOVE.L 0(A0,D0.W),(A1)+
AND.L #$FFFFF000,(A0,D0.W)
ADD.W #16,D0
CMP.W #1024,D0
BNE.S cucmloop
CLR.B RawKeyCode
BRA RedrawPattern
CopyCmds
LEA CmdsBuffer,A1
CLR.W D0
cocmloop
MOVE.L 0(A0,D0.W),(A1)+
ADD.W #16,D0
CMP.W #1024,D0
BNE.S cocmloop
CLR.B RawKeyCode
RTS
PasteCmds
BSR SaveUndo
LEA CmdsBuffer,A1
CLR.W D0
pacmloop
MOVE.L 0(A0,D0.W),D1
AND.L #$FFFFF000,D1
MOVE.L (A1)+,D2
AND.L #$00000FFF,D2
OR.L D2,D1
MOVE.L D1,(A0,D0.W)
ADD.W #16,D0
CMP.W #1024,D0
BNE.S pacmloop
CLR.B RawKeyCode
BRA RedrawPattern
;---- Swap Tracks ----
SwapTrack
BSR StorePtrCol
BSR SetWaitPtrCol
LEA SwapTrackText,A0
BSR ShowStatusText
swtloop BSR GetHexKey
TST.B D1
BEQ.S swtabor
CMP.B #4,D1
BHI.S swtloop
BSR SaveUndo
SUBQ.L #1,D1
LSL.L #2,D1
MOVE.L D1,D0
MOVE.L SongDataPtr,A0
LEA sd_patterndata(A0),A0
MOVE.L PatternNumber,D1
LSL.L #8,D1
LSL.L #2,D1
ADD.L D1,A0
MOVE.L A0,A1
ADD.L D0,A0
MOVE.W PattCurPos,D0
DIVU #6,D0
AND.L #$F,D0
LSL.L #2,D0
ADD.L D0,A1
MOVEQ #63,D1
swtloop2
MOVE.L (A0),D0
MOVE.L (A1),(A0)
MOVE.L D0,(A1)
LEA 16(A0),A0
LEA 16(A1),A1
DBRA D1,swtloop2
BSR RedrawPattern
swtabor BSR ShowAllRight
BRA RestorePtrCol
SwapTrackText dc.b 'Swap (1/2/3/4) ?',0,0
;---- Block Commands ----
BlockMarkText dc.b 'mark block 00-00',0,0
BlockErrorText dc.b 'no block marked !',0
BufEmptyText dc.b 'buffer is empty !',0
BlockFromPos dc.w 0
BlockToPos dc.w 0
BlockMarkFlag dc.w 0
BlockBufferFlag dc.w 0
JoinPasteFlag dc.w 0
PolyPasteFlag dc.w 0
BuffFromPos dc.w 0
BuffToPos dc.w 0
BeginBlock
CLR.B RawKeyCode
TST.W BlockMarkFlag
BEQ.S beblskp
blkunma CLR.W BlockMarkFlag
BRA ShowAllRight
beblskp MOVE.W #1,BlockMarkFlag
MOVE.W ScrPattPos,BlockFromPos
MOVE.W ScrPattPos,BlockToPos
ShowBlockPos
MOVE.W BlockFromPos,D0
MOVE.W BlockToPos,D1
CMP.W D0,D1
BHS.S sbpskip
EXG D0,D1
sbpskip LEA BlockMarkText+12(PC),A0
BSR IntTo2DecAscii
LEA BlockMarkText+15(PC),A0
MOVE.W D1,D0
BSR IntTo2DecAscii
LEA BlockMarkText(PC),A0
BRA ShowStatusText
Re_MarkBlock
CLR.B RawKeyCode
MOVE.W #1,BlockMarkFlag
MOVE.W BlockToPos,ScrPattPos
BSR SetScrPatternPos
BRA.S ShowBlockPos
CheckBlockPos
TST.W BlockMarkFlag
BEQ Return1
MOVE.W ScrPattPos,D0
CMP.W BlockToPos,D0
BEQ Return1
MOVE.W D0,BlockToPos
BRA.S ShowBlockPos
IntTo2DecAscii
AND.L #$FF,D0
DIVU #10,D0
ADD.B #'0',D0
MOVE.B D0,-1(A0)
SWAP D0
ADD.B #'0',D0
MOVE.B D0,(A0)
RTS
CutBlock
CLR.B RawKeyCode
TST.W BlockMarkFlag
BEQ BlockError
BSR.S cobldo
MOVE.W #1,BlockMarkFlag
BRA ClearBlock
CopyBlock
CLR.B RawKeyCode
TST.W BlockMarkFlag
BEQ BlockError
cobldo CLR.W BlockMarkFlag
MOVE.W #1,BlockBufferFlag
MOVE.W PattCurPos,D0
BSR GetPositionPtr
LEA BlockBuffer,A1
MOVEQ #63,D0
cobllop MOVE.L (A0),(A1)
LEA 16(A0),A0
LEA 16(A1),A1
DBRA D0,cobllop
MOVE.W BlockFromPos,D0
MOVE.W BlockToPos,D1
CMP.W D0,D1
BHS.S coblskp
EXG D0,D1
coblskp MOVE.W D0,BuffFromPos
MOVE.W D1,BuffToPos
BRA ShowAllRight
PasteBlock
CLR.B RawKeyCode
TST.W BlockBufferFlag
BEQ BufferError
BSR SaveUndo
MOVE.W PattCurPos,D0
BSR GetPositionPtr
LEA BlockBuffer,A1
MOVE.W BuffFromPos,D0
MOVE.W BuffToPos,D1
MOVE.W ScrPattPos,D2
LSL.W #4,D0
LSL.W #4,D1
LSL.W #4,D2
pabllop MOVE.L (A1,D0.W),D3
TST.W JoinPasteFlag
BEQ.S pablskp
MOVE.L D3,D4
AND.L #$FFFFF000,D4
BNE.S pablskp
MOVE.L (A0,D2.W),D4
AND.L #$FFFFF000,D4
AND.L #$00000FFF,D3
OR.L D4,D3
pablskp MOVE.L D3,(A0,D2.W)
CMP.W D0,D1
BEQ.S pablend
CMP.W #63*16,D0
BEQ.S pablend
CMP.W #63*16,D2
BEQ.S pablend
ADD.W #16,D0
ADD.W #16,D2
TST.W PolyPasteFlag
BEQ.S pabllop
MOVEM.L A1/D0-D2,-(SP)
BSR GotoNextMulti
MOVE.W PattCurPos,D0
BSR GetPositionPtr
MOVEM.L (SP)+,A1/D0-D2
BRA.S pabllop
pablend CLR.W JoinPasteFlag
CLR.W PolyPasteFlag
BSR ShowAllRight
BSR RedrawPattern
TST.W ShiftKeyStatus
BNE Return1
MOVE.W BuffToPos,D0
SUB.W BuffFromPos,D0
ADDQ.W #1,D0
ADD.W ScrPattPos,D0
CMP.W #63,D0
BLS.S pablset
MOVEQ #0,D0
pablset MOVE.W D0,ScrPattPos
BRA SetScrPatternPos
PolyphonizeBlock
MOVE.W #1,PolyPasteFlag
JoinPasteBlock
MOVE.W #1,JoinPasteFlag
BRA PasteBlock
InsertBlock
CLR.B RawKeyCode
TST.W BlockBufferFlag
BEQ BufferError
CMP.W #63,ScrPattPos
BEQ PasteBlock
MOVE.W BuffToPos,D0
SUB.W BuffFromPos,D0
inbllop MOVE.L D0,-(SP)
MOVE.W PattCurPos,D0
BSR GetPositionPtr
BSR inotr
MOVE.L (SP)+,D0
DBRA D0,inbllop
BRA PasteBlock
DeleteBlock
CLR.B RawKeyCode
TST.W BlockMarkFlag
BEQ BlockError
BSR SaveUndo
MOVE.W BlockFromPos,D0
MOVE.W BlockToPos,D1
CMP.W D0,D1
BHS.S deblskp
EXG D0,D1
deblskp CMP.W #63,D1
BEQ.S ClearBlock
CLR.W BlockMarkFlag
MOVE.W D0,ScrPattPos
ADDQ.W #1,ScrPattPos
SUB.W D0,D1
MOVE.W D1,D0
debllop MOVE.L D0,-(SP)
MOVE.W PattCurPos,D0
BSR GetPositionPtr
BSR dnt
MOVE.L (SP)+,D0
DBRA D0,debllop
SUBQ.W #1,ScrPattPos
BSR ShowAllRight
BRA RedrawPattern
ClearBlock
TST.W BlockMarkFlag
BEQ BlockError
BSR SaveUndo
CLR.W BlockMarkFlag
MOVE.W PattCurPos,D0
BSR GetPositionPtr
MOVE.W BlockFromPos,D0
MOVE.W BlockToPos,D1
CMP.W D0,D1
BHS.S clblskp
EXG D0,D1
clblskp LSL.W #4,D0
LSL.W #4,D1
MOVEQ #0,D2
clbllop MOVE.L D2,(A0,D0.W)
CMP.W D0,D1
BEQ.S clblend
ADD.W #16,D0
BRA.S clbllop
clblend BSR ShowAllRight
BRA RedrawPattern
BackwardsBlock
CLR.B RawKeyCode
TST.W BlockMarkFlag
BEQ BlockError
BSR SaveUndo
CLR.W BlockMarkFlag
MOVE.W PattCurPos,D0
BSR GetPositionPtr
MOVE.W BlockFromPos,D0
MOVE.W BlockToPos,D1
CMP.W D0,D1
BHS.S bablskp
EXG D0,D1
bablskp LSL.W #4,D0
LSL.W #4,D1
babllop MOVE.L (A0,D0.W),D2
MOVE.L (A0,D1.W),(A0,D0.W)
MOVE.L D2,(A0,D1.W)
CMP.W D1,D0
BHS.S bablend
ADD.W #16,D0
SUB.W #16,D1
CMP.W D1,D0
BHS.S bablend
BRA.S babllop
bablend BSR ShowAllRight
BRA RedrawPattern
TransBlockUp
SF trblflag
BRA.S trbldo
TransBlockDown
ST trblflag
trbldo CLR.B RawKeyCode
TST.W BlockMarkFlag
BEQ.S BlockError
BSR SaveUndo
MOVE.W #2,NoteShift
MOVE.W BlockFromPos,D0
MOVE.W BlockToPos,D1
CMP.W D0,D1
BHS.S trblskp
EXG D0,D1
trblskp MOVE.W D0,D5
LSL.W #4,D5
SUB.W D0,D1
MOVE.W D1,D6
MOVE.W PattCurPos,D0
BSR GetPositionPtr
LEA (A0,D5.W),A3
MOVEQ #0,D3
MOVE.B SampleAllFlag,sampallsave
ST SampleAllFlag
TST.B trblflag
BEQ.S trblup
BSR sandlo2
MOVE.B sampallsave,SampleAllFlag
BRA RedrawPattern
trblup BSR sanulo2
MOVE.B sampallsave,SampleAllFlag
BRA RedrawPattern
trblflag dc.b 0
sampallsave dc.b 0
BlockError
LEA BlockErrorText,A0
BSR ShowStatusText
BRA SetErrorPtrCol
BufferError
LEA BufEmptyText,A0
BSR ShowStatusText
BRA SetErrorPtrCol
ExpandTrack
CLR.B RawKeyCode
BSR SaveUndo
MOVE.W ScrPattPos,PosSave
ADDQ.W #1,ScrPattPos
CMP.W #64,ScrPattPos
BHS.S extrend
extrlop MOVE.W PattCurPos,D0
BSR GetPositionPtr
BSR inotr
ADDQ.W #2,ScrPattPos
CMP.W #64,ScrPattPos
BLO.S extrlop
extrend MOVE.W PosSave,ScrPattPos
BRA RedrawPattern
ContractTrack
CLR.B RawKeyCode
BSR SaveUndo
MOVE.W ScrPattPos,PosSave
ADDQ.W #1,ScrPattPos
CMP.W #64,ScrPattPos
BHS.S cotrend
cotrlop MOVE.W PattCurPos,D0
BSR GetPositionPtr
BSR dnt
ADDQ.W #1,ScrPattPos
CMP.W #64,ScrPattPos
BLO.S cotrlop
cotrend MOVE.W PosSave,ScrPattPos
BRA RedrawPattern
PosSave dc.w 0
KillToEndOfTrack
CLR.B RawKeyCode
BSR SaveUndo
MOVE.W PattCurPos,D0
BSR GetPositionPtr
MOVE.W ScrPattPos,D0
MOVE.W D0,D1
MULU #16,D1
LEA (A0,D1.W),A0
TST.W ShiftKeyStatus
BNE.S KillToStart
kteot CLR.L (A0)
LEA 16(A0),A0
ADDQ.W #1,D0
CMP.W #64,D0
BLO.S kteot
BRA RedrawPattern
KillToStart
CLR.L (A0)
LEA -16(A0),A0
TST.W D0
BEQ RedrawPattern
SUBQ.W #1,D0
BRA.S KillToStart
UndoLastChange
CLR.B RawKeyCode
MOVEQ #0,D0
BSR GetPositionPtr
LEA UndoBuffer,A1
MOVE.W #255,D0
unlalop MOVE.L (A1),D1
MOVE.L (A0),(A1)+
MOVE.L D1,(A0)+
DBRA D0,unlalop
BRA RedrawPattern
SaveUndo
MOVEM.L D0/A0-A1,-(SP)
MOVEQ #0,D0
BSR GetPositionPtr
LEA UndoBuffer,A1
MOVE.W #255,D0
saunlop MOVE.L (A0)+,(A1)+
DBRA D0,saunlop
MOVEM.L (SP)+,D0/A0-A1
RTS
BoostAll
LEA BoostAllText,A0
BSR AreYouSure
BNE SetErrorPtrCol
MOVE.W InsNum,SaveInstr
MOVE.W #1,InsNum
boallop BSR ShowSampleInfo
BSR Boost2
ADDQ.W #1,InsNum
CMP.W #32,InsNum
BLO.S boallop
MOVE.W SaveInstr,InsNum
BRA ShowSampleInfo
FilterAll
LEA FilterAllText,A0
BSR AreYouSure
BNE SetErrorPtrCol
MOVE.W InsNum,SaveInstr
MOVE.W #1,InsNum
fiallop BSR ShowSampleInfo
BSR Filter2
ADDQ.W #1,InsNum
CMP.W #32,InsNum
BLO.S fiallop
MOVE.W SaveInstr,InsNum
BRA ShowSampleInfo
BoostAllText dc.b 'boost all samples',0
FilterAllText dc.b 'filter all sampls',0
SaveInstr dc.w 0
;---- Check Function Keys F1-F2 ----
CheckF1_F2
CMP.B #80,RawKeyCode
BEQ.S SetOctaveLow
CMP.B #81,RawKeyCode
BEQ.S SetOctaveHigh
RTS
SetOctaveLow
MOVE.L #KbdTransTable1,KeyTransTabPtr
CLR.B RawKeyCode
RTS
SetOctaveHigh
MOVE.L #KbdTransTable2,KeyTransTabPtr
CLR.B RawKeyCode
RTS
;---- Get Hex Key ----
GetHexByte
BSR StorePtrCol
BSR SetWaitPtrCol
CLR.B RawKeyCode
MOVEQ #0,D0
MOVE.W TextOffset,D0
DIVU #40,D0
ADDQ.W #6,D0
MOVE.W D0,LineCurY
SWAP D0
LSL.W #3,D0
ADDQ.W #4,D0
MOVE.W D0,LineCurX
BSR UpdateLineCurPos
BSR.S GetHexKey
MOVE.L D1,D0
MOVE.B D1,D6
LSL.B #4,D6
BSR PrintHexDigit
ADD.W #8,LineCurX
BSR UpdateLineCurPos
BSR.S GetHexKey
MOVE.L D1,D0
OR.B D1,D6
BSR PrintHexDigit
CLR.W LineCurX
MOVE.W #270,LineCurY
BSR UpdateLineCurPos
BSR RestorePtrCol
MOVEQ #0,D0
MOVE.B D6,D0
RTS
GetHexKey
CLR.B MixChar
MOVEQ #0,D0
MOVEQ #0,D1
BTST #2,$DFF016
BEQ.S ghkreturn
BSR DoKeyBuffer
MOVE.B RawKeyCode,D0
MOVE.B D0,MixChar
BEQ.S GetHexKey
CMP.B #68,D0 ; CR
BEQ.S ghkreturn
CMP.B #69,D0 ; Esc
BEQ.S ghkreturn
CMP.B #79,D0 ; <--
BEQ.S ghkleft
CMP.B #78,D0 ; -->
BEQ.S ghkright
BSR.S CheckHexKey
CMP.B #16,D1
BEQ.S GetHexKey
CLR.B RawKeyCode
ghkreturn
MOVEQ #0,D0
RTS
ghkleft MOVEQ #-1,D0
RTS
ghkright
MOVEQ #1,D0
RTS
CheckHexKey
LEA RawKeyHexTable,A0
MOVEQ #0,D1
chxloop CMP.B (A0)+,D0
BEQ Return1
ADDQ.B #1,D1
CMP.B #16,D1
BNE.S chxloop
RTS
;---- Enter Edit Commands (effects) ----
EditCommand
TST.L EditMode
BEQ Return1
MOVEQ #0,D0
MOVE.B RawKeyCode,D0
BSR.S CheckHexKey
CMP.B #16,D1
BNE.S DoEditCommand
RTS
DoEditCommand
CMP.W #1,PattCurPos
BNE.S ChkPos2
CMP.W #1,D1
BHI Return1
MOVE.L #$FFF,D2
CLR.W CmdOffset
LSL.W #4,D1
LSL.W #8,D1
BRA UpdateCommand
ChkPos2 CMP.W #2,PattCurPos
BNE.S ChkPos3
MOVE.L #$FFF,D2
MOVE.W #2,CmdOffset
LSL.W #4,D1
LSL.W #8,D1
BRA UpdateCommand
ChkPos3 CMP.W #3,PattCurPos
BNE.S ChkPos4
MOVE.L #$F0FF,D2
MOVE.W #2,CmdOffset
LSL.W #8,D1
BRA UpdateCommand
ChkPos4 CMP.W #4,PattCurPos
BNE.S ChkPos5
MOVE.L #$FF0F,D2
MOVE.W #2,CmdOffset
LSL.W #4,D1
BRA UpdateCommand
ChkPos5 CMP.W #5,PattCurPos
BNE.S ChkPos7
MOVE.L #$FFF0,D2
MOVE.W #2,CmdOffset
BRA UpdateCommand
ChkPos7 CMP.W #7,PattCurPos
BNE.S ChkPos8
CMP.W #1,D1
BHI Return1
MOVE.L #$FFF,D2
MOVE.W #4,CmdOffset
LSL.W #4,D1
LSL.W #8,D1
BRA UpdateCommand
ChkPos8 CMP.W #8,PattCurPos
BNE.S ChkPos9
MOVE.L #$FFF,D2
MOVE.W #6,CmdOffset
LSL.W #4,D1
LSL.W #8,D1
BRA UpdateCommand
ChkPos9 CMP.W #9,PattCurPos
BNE.S ChkPos10
MOVE.L #$F0FF,D2
MOVE.W #6,CmdOffset
LSL.W #8,D1
BRA UpdateCommand
ChkPos10
CMP.W #10,PattCurPos
BNE.S ChkPos11
MOVE.L #$FF0F,D2
MOVE.W #6,CmdOffset
LSL.W #4,D1
BRA UpdateCommand
ChkPos11
CMP.W #11,PattCurPos
BNE.S ChkPos13
MOVE.L #$FFF0,D2
MOVE.W #6,CmdOffset
BRA UpdateCommand
ChkPos13
CMP.W #13,PattCurPos
BNE.S ChkPos14
CMP.W #1,D1
BHI Return1
MOVE.L #$FFF,D2
MOVE.W #8,CmdOffset
LSL.W #4,D1
LSL.W #8,D1
BRA UpdateCommand
ChkPos14
CMP.W #14,PattCurPos
BNE.S ChkPos15
MOVE.L #$FFF,D2
MOVE.W #10,CmdOffset
LSL.W #4,D1
LSL.W #8,D1
BRA UpdateCommand
ChkPos15
CMP.W #15,PattCurPos
BNE.S ChkPos16
MOVE.L #$F0FF,D2
MOVE.W #10,CmdOffset
LSL.W #8,D1
BRA UpdateCommand
ChkPos16
CMP.W #16,PattCurPos
BNE.S ChkPos17
MOVE.L #$FF0F,D2
MOVE.W #10,CmdOffset
LSL.W #4,D1
BRA UpdateCommand
ChkPos17
CMP.W #17,PattCurPos
BNE.S ChkPos19
MOVE.L #$FFF0,D2
MOVE.W #10,CmdOffset
BRA UpdateCommand
ChkPos19
CMP.W #19,PattCurPos
BNE.S ChkPos20
CMP.W #1,D1
BHI Return1
MOVE.L #$FFF,D2
MOVE.W #12,CmdOffset
LSL.W #4,D1
LSL.W #8,D1
BRA.S UpdateCommand
ChkPos20
CMP.W #20,PattCurPos
BNE.S ChkPos21
MOVE.L #$FFF,D2
MOVE.W #14,CmdOffset
LSL.W #4,D1
LSL.W #8,D1
BRA.S UpdateCommand
ChkPos21
CMP.W #21,PattCurPos
BNE.S ChkPos22
MOVE.L #$F0FF,D2
MOVE.W #14,CmdOffset
LSL.W #8,D1
BRA.S UpdateCommand
ChkPos22
CMP.W #22,PattCurPos
BNE.S MustBePos23
MOVE.L #$FF0F,D2
MOVE.W #14,CmdOffset
LSL.W #4,D1
BRA.S UpdateCommand
MustBePos23
MOVE.L #$FFF0,D2
MOVE.W #14,CmdOffset
UpdateCommand
MOVE.L SongDataPtr,A0
LEA sd_patterndata(A0),A0
MOVE.L PatternNumber,D0
LSL.L #8,D0
LSL.L #2,D0
ADD.L D0,A0
MOVEQ #0,D0
MOVE.W ScrPattPos,D0
LSL.W #4,D0
EXT.L D0
ADD.L D0,A0
ADD.W CmdOffset,A0
AND.W D2,(A0)
ADD.W D1,(A0)
MOVE.W (A0),WordNumber
MOVEQ #0,D0
MOVE.W ScrPattPos,D0
MULU #7*40,D0
MOVE.W PattCurPos,D1
DIVU #6,D1
MULU #9,D1
ADD.L D1,D0
ADD.W #7528,D0
MOVE.W D0,TextOffset
CMP.W #0,CmdOffset
BEQ.S ShowInstrNibble
CMP.W #4,CmdOffset
BEQ.S ShowInstrNibble
CMP.W #8,CmdOffset
BEQ.S ShowInstrNibble
CMP.W #12,CmdOffset
BEQ.S ShowInstrNibble
BSR PrintHexWord
dscend BSR EditMoveDown
CLR.B RawKeyCode
RTS
ShowInstrNibble
SUBQ.W #1,TextOffset
MOVE.W #1,TextLength
MOVEQ #0,D0
MOVE.W (A0),D0
AND.W #$F000,D0
BNE.S sinokok
TST.B BlankZeroFlag
BEQ.S sinokok
MOVE.L #BlankInsText,D0
BRA.S sinprt
sinokok LSR.W #4,D0
LSR.W #7,D0
ADD.L #FastHexTable+1,D0
sinprt MOVE.L D0,ShowTextPtr
BSR ShowText
BRA.S dscend
;---- Store/Insert Effect Commands ----
CheckStoreEffect
MOVEQ #0,D0
MOVE.B RawKeyCode,D0
BEQ Return1
CMP.B #70,D0 ; Del
BEQ CheckKeyboard2
CMP.B #10,D0
BHI Return1
SUBQ.B #1,D0
ADD.B D0,D0
MOVE.L D0,D7
MOVE.W PattCurPos,D0
BSR GetPositionPtr
MOVE.W ScrPattPos,D0
LSL.W #4,D0
LEA (A0,D0.W),A0
MOVE.W 2(A0),D0
AND.W #$0FFF,D0
LEA EffectMacros,A0
MOVE.W D0,(A0,D7.W)
LEA CommandStoredText,A0
BSR ShowStatusText
BSR WaitALittle
BRA ShowAllRight
CommandStoredText dc.b 'command stored!',0
CheckInsertEffect
CLR.W InsEfx
MOVEQ #0,D0
MOVE.B RawKeyCode,D0
BEQ Return1
CMP.B #70,D0 ; Del
BEQ CheckKeyboard2
CMP.B #11,D0 ; -
BEQ DecreaseEffect
CMP.B #12,D0 ; = (+)
BEQ.S IncreaseEffect
CMP.B #13,D0 ; \
BEQ.S CopyEffect
CMP.B #10,D0
BHI Return1
SUBQ.B #1,D0
ADD.B D0,D0
LEA EffectMacros,A0
MOVE.W (A0,D0.W),InsEfx
DoInsEffect
MOVE.B #70,RawKeyCode
BRA CheckNoteKeys
GetLastEffect
MOVE.W PattCurPos,D0
BSR GetPositionPtr
MOVE.W ScrPattPos,D0
SUBQ.W #1,D0
AND.W #$3F,D0
LSL.W #4,D0
LEA (A0,D0.W),A0
MOVE.W 2(A0),D0
AND.W #$0FFF,D0
RTS
CopyEffect
BSR.S GetLastEffect
MOVE.W D0,InsEfx
BRA.S DoInsEffect
IncreaseEffect
BSR.S GetLastEffect
MOVE.W D0,D1
AND.W #$0F00,D1
CMP.W #$0E00,D1
BEQ.S IncECom
ADDQ.B #1,D0
MOVE.W D0,InsEfx
BRA.S DoInsEffect
IncECom MOVE.W D0,D1
ADDQ.B #1,D1
AND.B #$0F,D1
AND.W #$0FF0,D0
OR.B D1,D0
MOVE.W D0,InsEfx
BRA.S DoInsEffect
DecreaseEffect
BSR.S GetLastEffect
MOVE.W D0,D1
AND.W #$0F00,D1
CMP.W #$0E00,D1
BEQ.S DecECom
SUBQ.B #1,D0
MOVE.W D0,InsEfx
BRA DoInsEffect
DecECom MOVE.W D0,D1
SUBQ.B #1,D1
AND.B #$0F,D1
AND.W #$0FF0,D0
OR.B D1,D0
MOVE.W D0,InsEfx
BRA DoInsEffect
InsEfx dc.w 0
;---- Check Keyboard for notekeys ----
CheckKeyboard
TST.B RawKeyCode
BEQ Return1
TST.W LeftAmigaStatus
BNE Return1
TST.W CtrlKeyStatus
BNE Return1
TST.W ShiftKeyStatus
BNE CheckStoreEffect
TST.W AltKeyStatus
BNE CheckInsertEffect
CheckKeyboard2
MOVE.W PattCurPos,D0
BEQ.S CheckNoteKeys
CMP.W #6,D0
BEQ.S CheckNoteKeys
CMP.W #12,D0
BEQ.S CheckNoteKeys
CMP.W #18,D0
BEQ.S CheckNoteKeys
TST.L EditMode
BNE EditCommand
RTS
CheckNoteKeys
LEA RawKeyScaleTable,A0
MOVE.B RawKeyCode,D1
MOVEQ #38,D0
cnkloop CMP.B 0(A0,D0.W),D1
BEQ.S NoteKeyPressed
DBRA D0,cnkloop
RTS
NoteKeyPressed
CLR.B RawKeyCode
MOVE.L KeyTransTabPtr,A1
MOVE.B (A1,D0.W),D0
CMP.W #36,D0
BHS.S nkpskip
MOVE.L SplitAddress,D1
BEQ.S nkpskip
CLR.L SplitAddress
MOVE.L D1,A0
MOVE.B D0,(A0)
MOVE.W SamNoteType,D1
BEQ ShowSplit
CLR.W SamNoteType
AND.W #$FF,D0
MOVE.W D0,(A0)
CMP.W #1,D1
BEQ.S loclab1
CMP.W #3,D1
BEQ ShowS2TuneNote
CMP.W #4,D1
BEQ ShowAllRight
JMP ShowResamNote
loclab1 JMP ShowSamNote
nkpskip MOVE.W InsNum,PlayInsNum
TST.B SplitFlag
BEQ.S nkpskip2
LEA SplitInstrTable,A1
MOVE.B (A1,D0.W),D1
BEQ.S nkpskip3
MOVE.B D1,PlayInsNum+1
nkpskip3
LEA SplitTransTable,A1
MOVE.B (A1,D0.W),D0
nkpskip2
MOVEQ #0,D2
playtheinstr
LEA PeriodTable,A1 ; note in d0 here
MOVE.L D0,D4
LSL.W #1,D0
MOVEQ #0,D3
MOVE.W (A1,D0.W),D3
MOVE.L SongDataPtr,A0 ; This fixes finetune...
LEA 14(A0),A0
MOVE.W InsNum,D1
BNE.S nkpskipit
MOVE.W LastInsNum,D1
nkpskipit
MULU #30,D1
ADD.L D1,A0
MOVEQ #0,D1
MOVE.B (A0),D1 ; get finetune
MULU #37*2,D1
ADD.L D1,A1
MOVE.W (A1,D0.W),CurrentPlayNote
TST.L D2
BEQ.S nkpnrml
CMP.B #2,pnoteflag
BNE antpskip
nkpnrml TST.L EditMode
BEQ antpskip
AddNoteToPattern
MOVE.L SongDataPtr,A0
LEA sd_patterndata(A0),A0 ; Find first pattern
MOVE.L PatternNumber,D0
LSL.L #8,D0
LSL.L #2,D0
ADD.L D0,A0 ; Find current pattern
MOVEQ #0,D0
MOVE.W ScrPattPos,D0
BSR QuantizeCheck
LSL.W #4,D0
EXT.L D0
ADD.L D0,A0 ; Find current pos
MOVE.W PattCurPos,D0
DIVU #6,D0
LSL.W #2,D0
EXT.L D0
ADD.L D0,A0 ; Find current channel
TST.W AltKeyStatus
BEQ.S antpsks
AND.L #$FFFFF000,(A0)
MOVE.W InsEfx,D0
OR.W D0,2(A0)
BRA.S antp3
antpsks TST.W ShiftKeyStatus
BEQ.S antpskip2
CLR.L (A0)
antpskip2
MOVE.W D3,(A0) ; Put note into pattern
BEQ.S antp2
TST.B AutoInsFlag
BEQ.S antp4
MOVE.W VolumeEfx,2(A0)
antp4 MOVEQ #0,D0
MOVE.W PlayInsNum,D0
LSL.W #4,D0
AND.B #$F,2(A0)
ADD.B D0,2(A0)
LSL.W #4,D0
AND.W #$F000,D0
OR.W D0,(A0)
BRA.S antp3
antp2 AND.W #$0FFF,2(A0)
antp3 MOVE.W 2(A0),CurrCmds
MOVE.L NoteNamesPtr,A0
LSL.W #2,D4
EXT.L D4
ADD.L D4,A0
MOVE.L A0,ShowTextPtr
MOVE.W #3,TextLength
MOVEQ #0,D0
MOVE.W ScrPattPos,D0
BSR QuantizeCheck
MULU #7*40,D0
MOVEQ #0,D1
MOVE.W PattCurPos,D1
DIVU #6,D1
MULU #9,D1
ADD.L D1,D0
ADD.W #7524,D0
MOVE.W D0,TextOffset
TST.W AltKeyStatus
BEQ.S antpnot
ADDQ.W #4,D0
MOVE.W D0,TextOffset
BRA.S antpalt
antpnot BSR ShowText ; Show notename
BSR PrintHiInstrNum
antpalt
MOVE.W CurrCmds,WordNumber
BSR PrintHexWord
BSR EditMoveDown
antpskip
TST.W DidQuantize
BNE.S testmul
TST.W CurrentPlayNote
BNE PlayNote
testmul TST.B MultiFlag
BEQ Return1
GotoNextMulti
MOVEQ #0,D0
MOVE.W PattCurPos,D0
DIVU #6,D0
LEA MultiModeNext,A0
MOVE.B (A0,D0.W),D0
SUBQ.W #1,D0
AND.W #3,D0
MULU #6,D0
MOVE.W D0,PattCurPos
BRA UpdateCursorPos
QuantizeCheck
TST.L RunMode
BEQ.S qcend
MOVEQ #0,D1
MOVE.B QuantizeValue,D1
BEQ.S qcend
CMP.W #1,D1
BEQ.S QuanOne
MOVE.W #1,DidQuantize
MOVE.L D1,D2
LSR.W #1,D2
ADD.W D0,D2
AND.W #$003F,D2
DIVU D1,D2
MULU D1,D2
CMP.W D0,D2
BHI.S qcskip
CLR.W DidQuantize
qcskip MOVE.W D2,D0
RTS
QuanOne MOVE.L CurrSpeed,D1
LSR.L #1,D1
CMP.L Counter,D1
BLS.S QuantToNextNote
qcend CLR.W DidQuantize
RTS
QuantToNextNote
ADDQ.W #1,D0
AND.W #$003F,D0
MOVE.W #1,DidQuantize
RTS
PlayNote
CMP.W #18,PattCurPos
BNE.S ChkChan3
LEA $DFF0D0,A5
LEA audchan4temp,A4
BRA.S DoPlayNote
ChkChan3
CMP.W #12,PattCurPos
BNE.S ChkChan2
LEA $DFF0C0,A5
LEA audchan3temp,A4
BRA.S DoPlayNote
ChkChan2
CMP.W #6,PattCurPos
BNE.S ChkChan1
LEA $DFF0B0,A5
LEA audchan2temp,A4
BRA.S DoPlayNote
ChkChan1
TST.W PattCurPos
BNE Return1
LEA $DFF0A0,A5
LEA audchan1temp,A4
DoPlayNote
MOVE.L A5,NoteAddr
LEA SampleInfo,A6
MOVE.W PlayInsNum,D0
BEQ.S dpnplay
LSL.L #2,D0
LEA SamplePtrs,A0
LEA SampleInfo2,A6
MOVE.L 0(A0,D0.W),si_pointer2
MOVE.L SongDataPtr,A0
LEA -10(A0),A0
MOVE.W PlayInsNum,D0
MOVE.B D0,PlayInsNum2
MULU #30,D0
ADD.L D0,A0
MOVE.L 22(A0),SampleInfo2
MOVE.L 26(A0),si_long2
dpnplay MOVE.B PlayInsNum2,n_samplenum(A4)
MOVE.W 4(A6),D0 ; repeat
BNE.S dpn2
MOVE.W (A6),D0 ; length
BRA.S dpn3
dpn2 ADD.W 6(A6),D0 ; add replen
dpn3 MOVEQ #0,D1
MOVE.B 3(A6),D1
MOVE.W D1,8(A5) ; Set volume
MOVE.B D1,n_volume(A4)
MOVE.W CurrentPlayNote,6(A5) ; Set period
MOVE.W CurrentPlayNote,n_period(A4)
MOVE.W n_dmabit(A4),$DFF096 ; Channel DMA off
MOVE.L 8(A6),D1
ADD.L StartOfs,D1
MOVE.L D1,(A5) ; Set sampledata pointer
CLR.L StartOfs
MOVE.L D1,n_start(A4)
MOVE.W D0,4(A5) ; Set length
MOVE.W D0,n_length(A4)
BNE.S dpnnz
MOVEQ #1,D0
MOVE.W D0,4(A5)
MOVE.W D0,n_length(A4)
dpnnz MOVE.W CurrentPlayNote,D0
BSR PlayNoteAnalyze
MOVE.W DMAWait,D0
dpnolp1 DBRA D0,dpnolp1
MOVE.W n_dmabit(A4),D0
AND.W ActiveChannels,D0
OR.W #$8000,D0
MOVE.W D0,$DFF096 ; Turn DMA back on
MOVE.W DMAWait,D0
dpnolp2 DBRA D0,dpnolp2
MOVEQ #0,D1
MOVE.W 4(A6),D1 ; repeat*2
ADD.L D1,D1
ADD.L 8(A6),D1 ; + startptr
MOVE.L D1,(A5) ; Set loop pointer
MOVE.L D1,n_loopstart(A4)
MOVE.W 6(A6),4(A5) ; Set loop length
MOVE.W 6(A6),n_replen(A4)
ST n_trigger(A4)
BRA testmul
PlayInsNum2 dc.b 0,0
;---- Check Cursor Arrow Keys ----
ArrowKeys
CMP.B #4,EnterTextFlag
BEQ Return1
MOVE.B RawKeyCode,D0
TST.W GetLineFlag
BNE.S arkeskip
TST.W ShiftKeyStatus
BNE.S arkeskip
TST.W AltKeyStatus
BNE.S arkeskip
CMP.W #2,CurrScreen
BEQ.S arkeskip
CMP.B #78,D0
BEQ RightArrow
CMP.B #79,D0
BEQ LeftArrow
arkeskip
CMP.B #76,D0
BEQ.S UpArrow
CMP.B #77,D0
BEQ DownArrow
CLR.W ArrowPressed
RTS
ArrowPressed dc.w 0
ArrowRepCounter dc.w 0
UpArrow TST.L RunMode
BNE Return1
CMP.W #2,CurrScreen
BEQ Return1
CMP.W #3,CurrScreen
BEQ Return1
CMP.W #4,CurrScreen
BEQ Return1
CMP.W #6,CurrScreen
BEQ Return1
TST.W ArrowPressed
BEQ.S MoveOneUp
ADDQ.W #1,ArrowRepCounter
TST.W AltKeyStatus
BNE.S AltUpArrow
TST.W ShiftKeyStatus
BNE.S ShiftUpArrow
CMP.W #6,ArrowRepCounter
BPL.S MoveOneUp
RTS
ShiftUpArrow
CMP.W #3,ArrowRepCounter
BPL.S MoveOneUp
RTS
AltUpArrow
CMP.W #1,ArrowRepCounter
BPL.S MoveOneUp
RTS
MoveOneUp
CLR.W ArrowRepCounter
MOVE.W #$FFFF,ArrowPressed
CMP.L #'patt',RunMode
BEQ Return1
SUBQ.W #1,ScrPattPos
AND.W #$003F,ScrPattPos
BRA SetScrPatternPos
DownArrow
TST.L RunMode
BNE Return1
CMP.W #2,CurrScreen
BEQ Return1
CMP.W #3,CurrScreen
BEQ Return1
CMP.W #4,CurrScreen
BEQ Return1
CMP.W #6,CurrScreen
BEQ Return1
TST.W ArrowPressed
BEQ.S MoveOneDown
ADDQ.W #1,ArrowRepCounter
TST.W AltKeyStatus
BNE.S AltDownArrow
TST.W ShiftKeyStatus
BNE.S ShiftDownArrow
CMP.W #6,ArrowRepCounter
BPL.S MoveOneDown
RTS
ShiftDownArrow
CMP.W #3,ArrowRepCounter
BPL.S MoveOneDown
RTS
AltDownArrow
CMP.W #1,ArrowRepCounter
BPL.S MoveOneDown
RTS
MoveOneDown
CLR.W ArrowRepCounter
MOVE.W #$FFFF,ArrowPressed
TST.L RunMode
BNE Return1
ADDQ.W #1,ScrPattPos
AND.W #$003F,ScrPattPos
BRA SetScrPatternPos
EditMoveDown
TST.L RunMode
BNE Return1
MOVE.W EditMoveAdd,D0
ADD.W D0,ScrPattPos
AND.W #$003F,ScrPattPos
BRA SetScrPatternPos
EditMoveAdd dc.w 1
RightArrow
TST.W ArrowPressed
BEQ.S MoveOneRight
ADDQ.W #1,ArrowRepCounter
CMP.W #6,ArrowRepCounter
BPL.S MoveOneRight
RTS
PatternOneUp
ADDQ.L #1,PatternNumber
AND.L #$3F,PatternNumber
BSR Wait_4000
BRA RedrawPattern
MoveOneRight
CLR.W ArrowRepCounter
MOVE.W #$FFFF,ArrowPressed
ADDQ.W #1,PattCurPos
CMP.W #24,PattCurPos
BMI.S morskip
CLR.W PattCurPos
morskip BRA.S UpdateCursorPos
LeftArrow
TST.W ArrowPressed
BEQ.S MoveOneLeft
ADDQ.W #1,ArrowRepCounter
CMP.W #6,ArrowRepCounter
BPL.S MoveOneLeft
RTS
PatternOneDown
SUBQ.L #1,PatternNumber
AND.L #$3F,PatternNumber
BSR Wait_4000
BRA RedrawPattern
MoveOneLeft
CLR.W ArrowRepCounter
MOVE.W #$FFFF,ArrowPressed
SUBQ.W #1,PattCurPos
TST.W PattCurPos
BPL UpdateCursorPos
MOVE.W #23,PattCurPos
UpdateCursorPos
TST.W SamScrEnable
BNE Return1
MOVE.W PattCurPos,D0
LEA CursorPosTable,A0
MOVE.B 0(A0,D0.W),D0
LSL.W #3,D0
ADD.W #9,D0
MOVE.W #$BD,D1
MOVEQ #14,D2 ; 14 lines
LEA CursorSpriteData,A0
BRA SetSpritePos
ArrowKeys2
MOVE.B RawKeyCode,D0
CMP.B #76,D0
BEQ.S UpArrow2
CMP.B #77,D0
BEQ.S DownArrow2
CMP.B #79,D0
BEQ.S LeftArrow2
CMP.B #78,D0
BEQ RightArrow2
RTS
UpArrow2
CMP.W #2,CurrScreen
BEQ HelpUp
CMP.W #3,CurrScreen
BEQ FilenameOneUp
CMP.W #4,CurrScreen
BEQ PED_OneUp
CMP.W #6,CurrScreen
BEQ PLSTOneUp
RTS
DownArrow2
CMP.W #2,CurrScreen
BEQ HelpDown
CMP.W #3,CurrScreen
BEQ FilenameOneDown
CMP.W #4,CurrScreen
BEQ PED_OneDown
CMP.W #6,CurrScreen
BEQ PLSTOneDown
RTS
LeftArrow2
TST.W ShiftKeyStatus
BNE PositionDown
TST.W AltKeyStatus
BNE PatternOneDown
TST.W CtrlKeyStatus
BNE SampleNumDown
CMP.W #2,CurrScreen
BEQ HelpLeft
RTS
RightArrow2
TST.W ShiftKeyStatus
BNE PositionUp
TST.W AltKeyStatus
BNE PatternOneUp
TST.W CtrlKeyStatus
BNE SampleNumUp
CMP.W #2,CurrScreen
BEQ HelpRight
RTS
;---- Update Line Cursor Position ----
UpdateLineCurPos
MOVE.W LineCurX,D0
MOVE.W LineCurY,D1
SUBQ.W #1,D0
MOVEQ #2,D2
LEA LineCurSpriteData,A0
BRA SetSpritePos
;---- Check Gadgets ----
CheckGadgets
BSR UpdatePointerPos
BSR.S CheckGadgets2
CLR.W notogfl
CMP.W #$FFFF,GadgRepeat
BEQ.S CgRepeat
MOVEQ #0,D0
cgloop ADDQ.L #1,D0
TST.B HHFlag
BEQ.S cgnorma
CMP.L #40000*5,D0
BEQ.S CgRepeat
BRA.S cgnorm2
cgnorma CMP.L #40000,D0
BEQ.S CgRepeat
cgnorm2 BTST #6,$BFE001
BEQ.S cgloop
CLR.W UpOrDown
BRA MainLoop
CgRepeat
TST.B HHFlag
BEQ.S cgrepe2
BSR Wait_4000
cgrepe2 MOVE.W #$FFFF,GadgRepeat
BTST #6,$BFE001
BEQ.S CheckGadgets
CLR.W GadgRepeat
CLR.W UpOrDown
BRA MainLoop
CheckGadgets2
MOVE.W MouseX,MouseX2
BNE.S cgskip
TST.W MouseY
BNE.S cgskip
ChkQuit LEA QuitPTText,A0
BSR AreYouSure
BEQ ExitCleanup ; Quit PT!
RTS
cgskip MOVE.W MouseY,MouseY2
CMP.W #4,CurrScreen
BEQ CheckPresEdGadgs
MOVE.W MouseX2,D0
MOVE.W MouseY2,D1
CMP.W #122,D1
BHS WantedPattGadg
CMP.W #111,D1
BHS CheckSmplNamOrLoad
CMP.W #100,D1
BHS TypeInSongName
CMP.W #120,D0
BLO.S cgskip2
CMP.W #6,CurrScreen
BEQ CheckPLSTGadgs
cgskip2 CMP.W #2,CurrScreen
BEQ Return1
CMP.W #3,CurrScreen ; Screen 3 is DirScreen...
BEQ CheckDirGadgets
CMP.W #5,CurrScreen
BEQ CheckSetupGadgs
CMP.W #7,CurrScreen
BEQ CheckSetup2Gadgs
CMP.W #45,D1
BHS.S cgskip3
CMP.W #306,D0
BHS CheckToggle
CMP.W #244,D0
BHS.S MainMenu3
CMP.W #181,D0
BHS.S MainMenu2
CMP.W #120,D0
BHS MainMenu1
cgskip3 CMP.W #120,D0
BHS.S cgskip4
CMP.W #109,D0
BHS DownGadgets
CMP.W #98,D0
BHS UpGadgets
CMP.W #62,D0
BHS EnterNumGadg
BRA PosInsDelGadgs
cgskip4 TST.B EdEnable
BNE CheckEditOpGadgs
BRA ToggleAnaScope
MainMenu3
MOVE.W MouseY2,D0
CMP.W #34,D0
BHS DPMGFIH
CMP.W #23,D0
BHS Setup
CMP.W #12,D0
BHS PresetEditor
TST.W D0
BHS PLST
RTS
DPMGFIH JMP SamplerScreen
MainMenu2
MOVE.W MouseY2,D0
CMP.W #3,CurrScreen
BNE mm2skip
CMP.W #44,D0
BHS CheckDirGadgets2
mm2skip CMP.W #44,D0
BHS Return1
CMP.W #34,D0
BHS ShowDirScreen
CMP.W #23,D0
BHS DoEditOp
CMP.W #12,D0
BHS ClearAll
TST.W D0
BHS StopIt
RTS
MainMenu1
MOVE.W MouseY2,D0
CMP.W #3,CurrScreen
BNE.S mm1skip
CMP.W #44,D0
BHS CheckDirGadgets2
mm1skip CMP.W #44,D0
BHS Return1
CMP.W #34,D0
BHS RecordPattern
CMP.W #23,D0
BHS Edit
CMP.W #12,D0
BHS PlayPattern
TST.W D0
BHS PlaySong
RTS
;---- Disk Format ----
DiskFormatGadg
BSR WaitForButtonUp
BSR Wait_4000
BSR ClearFileNames
BSR SwapFormatBox
BSR WaitForButtonUp
LEA AreYouSureText,A0
BSR ShowStatusText
fmtbuttonchk
BSR DoKeyBuffer
MOVE.B RawKeyCode,D0
CMP.B #69,D0 ; ESC
BEQ.S fmtbend
BTST #6,$BFE001
BNE.S fmtbuttonchk
MOVEM.W MouseX,D0/D1
CMP.W #89,D0
BLO.S fmtbuttonchk
CMP.W #212,D0
BHI.S fmtbuttonchk
CMP.W #72,D1
BLO.S fmtbuttonchk
CMP.W #82,D1
BHI.S fmtbuttonchk
CMP.W #136,D0
BLO.S DiskFormat
CMP.W #166,D0
BLO.S fmtbuttonchk
fmtbend BSR.S SwapFormatBox
BRA SetErrorPtrCol
SwapFormatBox
LEA FormatBoxData,A1
LEA FormatBoxPos,A0
MOVEQ #38,D0
sfbloop1
MOVEQ #17,D1
sfbloop2
MOVE.B 10240(A0),D2
MOVE.B 702(A1),10240(A0)
MOVE.B D2,702(A1)
MOVE.B (A0),D2
MOVE.B (A1),(A0)+
MOVE.B D2,(A1)+
DBRA D1,sfbloop2
LEA $0016(A0),A0
DBRA D0,sfbloop1
RTS
DiskFormat
BSR SwapFormatBox
BSR ShowAllRight
BSR ClearFileNames
LEA PlsEntNamText,A0
MOVE.W #2570,D1
MOVEQ #17,D0
BSR ShowText3
LEA OfVolumeText,A0
MOVE.B #'_',15(A0)
MOVE.B #'_',16(A0)
MOVE.W #2810,D1
MOVEQ #17,D0
BSR ShowText3
BSR SetWaitPtrCol
LEA DiskNumText1,A6
MOVEQ #1,D0
df_loop CLR.B 0(A6,D0.W)
DBRA D0,df_loop
MOVE.L A6,TextEndPtr
MOVE.L A6,ShowTextPtr
ADDQ.L #2,TextEndPtr
MOVE.B #1,EnterTextFlag
MOVE.W #2825,A4
MOVE.W #2,TextLength
BSR GetTextLine
CLR.B EnterTextFlag
CLR.L TextEndPtr
BSR ClearFileNames
MOVE.L 4.W,A6
MOVE.L #5632,D0
MOVEQ #MEMF_CHIP,D1
JSR LVOAllocMem(A6)
MOVE.L D0,FormatDataPtr
BEQ df_memerr
BSR DoShowFreeMem
SUB.L A1,A1
JSR LVOFindTask(A6)
MOVE.L D0,ProcessPtr
LEA TrackdiskPort,A1
JSR LVOAddPort(A6)
LEA TrackdiskIOExtTD,A1
MOVEQ #0,D0
MOVEQ #0,D1
LEA TrackdiskName,A0
JSR LVOOpenDevice(A6)
MOVE.L #TrackdiskPort,TDPortPtr
CLR.W CylinderNumber
LEA TrackdiskIOExtTD,A1
MOVE.W #TD_CHANGESTATE,IO_COMMAND(A1)
JSR LVODoIO(A6) ; Check if disk in drive
TST.L IO_ACTUAL(A1)
BEQ.S df_indrive
LEA NoDiskInDriveText,A0
BSR ShowStatusText
MOVE.W #50,WaitTime
BSR SetErrorPtrCol
BRA df_cleanup
df_indrive
LEA TrackdiskIOExtTD,A1
MOVE.W #TD_PROTSTATUS,IO_COMMAND(A1)
JSR LVODoIO(A6) ; Check write protect
TST.L IO_ACTUAL(A1)
BEQ.S df_noprot
LEA WriteProtectedText,A0
BSR ShowStatusText
MOVE.W #50,WaitTime
BSR SetErrorPtrCol
BRA df_cleanup
df_noprot
LEA DiskFormatText,A0
MOVE.W #2581-7,D1
MOVEQ #11,D0
BSR ShowText3
LEA InProgressText,A0
MOVE.W #2821-7,D1
MOVEQ #11,D0
BSR ShowText3
CLR.L FmtDiskOffset
MOVE.L FormatDataPtr,FmtDataPtr
MOVE.L #$00001600,FmtDataSize
BSR ClearCylinder
BSR SetDiskPtrCol
df_formatloop
LEA FormattingCylText,A0
BSR ShowStatusText
MOVE.W CylinderNumber,D0
LSR.W #1,D0
MOVE.W D0,WordNumber
BSR Print2DecDigits
MOVE.L 4.W,A6
LEA TrackdiskIOExtTD,A1
MOVE.W #TD_FORMAT,IO_COMMAND(A1)
JSR LVODoIO(A6) ; Format cylinder
LEA VerifyingText,A0
BSR ShowStatusText
MOVE.W CylinderNumber,D0
LSR.W #1,D0
MOVE.W D0,WordNumber
BSR Print2DecDigits
MOVE.L 4.W,A6
LEA TrackdiskIOExtTD,A1
MOVE.W #CMD_READ,IO_COMMAND(A1)
JSR LVODoIO(A6) ; Read cylinder to verify
TST.B Fmt_hmmm
BEQ.S df_verifyok
LEA VerifyErrText(PC),A0
BSR ShowStatusText
MOVE.W #50,WaitTime
BSR SetErrorPtrCol
BRA df_cleanup
VerifyErrText dc.b "Verify error!",0
df_verifyok
ADD.L #$1600,FmtDiskOffset
ADDQ.W #1,CylinderNumber
CMP.W #160,CylinderNumber
BNE df_formatloop
LEA InitDiskText,A0
BSR ShowStatusText
BSR ClearCylinder
MOVE.L FormatDataPtr,A2
LEA BootblockData(PC),A0
MOVEQ #12,D0
.loop MOVE.L (A0)+,(A2)+
DBRA D0,.loop
LEA TrackdiskIOExtTD,A1
CLR.L IO_OFFSET(A1)
MOVE.L #512,IO_LENGTH(A1)
MOVE.W #CMD_WRITE,IO_COMMAND(A1)
MOVE.L 4.W,A6
JSR LVODoIO(A6) ; Write bootblock
MOVE.L #DateStamp,D1
MOVE.L DOSbase,A6
JSR LVODateStamp(A6)
MOVE.L 4.W,A6
BSR ClearCylinder
MOVE.L FormatDataPtr,A2
MOVE.W #2,2(A2)
MOVE.W #$0048,14(A2)
MOVE.L #$FFFFFFFF,$0138(A2)
MOVE.W #$0371,$013E(A2)
MOVE.L #$0553542D,$01B0(A2)
MOVE.W DiskNumText1,$01B4(A2)
MOVE.W #$06F7,$01E2(A2)
MOVE.W #1,$01FE(A2)
LEA DateStamp,A0
MOVE.L (A0),D0
MOVE.L D0,$01A4(A2)
MOVE.L D0,$01E4(A2)
MOVE.L 4(A0),D0
MOVE.L D0,$01A8(A2)
MOVE.L D0,$01E8(A2)
MOVE.L 8(A0),D0
MOVE.L D0,$01AC(A2)
MOVE.L D0,$01EC(A2)
MOVE.L A2,A3
MOVE.L A3,A4
MOVEQ #$7F,D1
MOVEQ #0,D0
MOVE.L D0,$0014(A4)
df_loop2
SUB.L (A3)+,D0
DBRA D1,df_loop2
MOVE.L D0,$0014(A4)
MOVE.L #$C000C037,$0200(A2)
LEA $0204(A2),A3
MOVEQ #$36,D0
df_loop3
MOVE.L #$FFFFFFFF,(A3)+
DBRA D0,df_loop3
MOVE.W #$3FFF,$0272(A2)
MOVE.W #$3FFF,$02DC(A2)
LEA TrackdiskIOExtTD,A1
MOVE.L #$0006E000,IO_OFFSET(A1)
MOVE.L #1024,IO_LENGTH(A1)
MOVE.W #CMD_WRITE,IO_COMMAND(A1)
JSR LVODoIO(A6)
LEA TrackdiskIOExtTD,A1
MOVE.W #CMD_UPDATE,IO_COMMAND(A1)
JSR LVODoIO(A6) ; Flush write buffer
df_cleanup
LEA TrackdiskIOExtTD,A1
MOVE.W #TD_MOTOR,IO_COMMAND(A1)
CLR.L IO_LENGTH(A1)
JSR LVODoIO(A6) ; Turn off the motor
MOVE.L Fmt_tja,A0
MOVE.L $0024(A0),A0
OR.B #2,$0040(A0)
LEA TrackdiskIOExtTD,A1
MOVE.L 4.W,A6
JSR LVOCloseDevice(A6)
LEA TrackdiskPort,A1
JSR LVORemPort(A6)
MOVE.L FormatDataPtr,A1
MOVE.L #5632,D0
JSR LVOFreeMem(A6)
CMP.W #160,CylinderNumber
BNE.S df_skip2
CMP.W #'00',DiskNumText1
BNE.S df_skip2
MOVE.L DOSbase,A6
MOVE.L #150,D1 ; Wait 3 sec
JSR LVODelay(A6)
MOVE.L #LockNameDF0,D1
MOVE.L #-2,D2
JSR LVOLock(A6)
MOVE.L D0,D6
BEQ df_skip3
MOVE.L D0,D1
JSR LVOCurrentDir(A6)
MOVE.L D0,D7
MOVE.L D6,D1
JSR LVOUnLock(A6)
MOVE.L #FmtSongDirName,D1
JSR LVOCreateDir(A6)
MOVE.L D0,D1
BEQ.S .err1
JSR LVOUnLock(A6)
.err1 MOVE.L #FmtModuleDirName,D1
JSR LVOCreateDir(A6)
MOVE.L D0,D1
BEQ.S df_skip2
JSR LVOUnLock(A6)
df_skip2
MOVE.L D7,D1
JSR LVOCurrentDir(A6)
df_skip3
BSR SetNormalPtrCol
BSR ShowAllRight
BSR ClearFileNames
MOVE.W #1,UpdateFreeMem
RTS
df_memerr
BSR OutOfMemErr
BRA.S df_skip2
ClearCylinder
MOVE.L FormatDataPtr,A0
MOVE.W #1407,D0
MOVEQ #0,D1
ccloop MOVE.L D1,(A0)+
DBRA D0,ccloop
RTS
BootblockData
dc.l $444F5300,$c0200f19,$00000370,$43fa0018
dc.l $4eaeffa0,$4a80670a,$20402068,$00167000
dc.l $4e7570ff,$60fa646f,$732e6c69,$62726172
dc.l $79000000
LockNameDF0 dc.b "df0:",0
even
;---- Clear All Data ----
ClearAll
ADD.L #1,LaHeTx
MOVE.B DisableAnalyzer,SaveDA
MOVE.B ScopeEnable,SaveScope
SF ScopeEnable
LEA PleaseSelectText,A0
BSR ShowStatusText
BSR StorePtrCol
BSR SetWaitPtrCol
BSR Wait_4000
CMP #1,CurrScreen
BNE.S clbskip
TST.B DisableAnalyzer
BNE.S clbskip
ST DisableAnalyzer
BSR ClearAnaHeights
BSR ClearRightArea
clbskip LEA ClearBoxData,A1
BSR SwapBoxMem
BSR WaitForButtonUp
BSR Wait_4000
clearbuttoncheck
BTST #2,$DFF016
BEQ ClrCancel
BSR DoKeyBuffer
MOVE.B RawKeyCode,D0
CMP.B #33,D0 ; Pressed S
BEQ ClrSamples
CMP.B #24,D0 ; Pressed O
BEQ ClrSong
CMP.B #32,D0 ; Pressed A
BEQ ClrAll
CMP.B #51,D0 ; Pressed C
BEQ ClrCancel
CMP.B #69,D0 ; Pressed Esc
BEQ ClrCancel
BTST #6,$BFE001 ; Left Mousebutton
BNE.S clearbuttoncheck
MOVEM.W MouseX,D0/D1
CMP.W #166,D0
BLO.S clearbuttoncheck
CMP.W #257,D0
BHI.S clearbuttoncheck
CMP.W #58,D1
BLO.S clearbuttoncheck
CMP.W #84,D1
BHI.S clearbuttoncheck
CMP.W #204,D0
BHS.S samporcancel
CMP.W #198,D0
BLS.S songorall
BRA.S clearbuttoncheck
songorall
CMP.W #74,D1
BHS.S ClrAll
CMP.W #68,D1
BLS ClrSong
BRA clearbuttoncheck
samporcancel
CMP.W #74,D1
BHS.S ClrCancel
CMP.W #68,D1
BLS.S ClrSamples
BRA clearbuttoncheck
RemoveClearBox
LEA ClearBoxData,A1
BSR SwapBoxMem
BSR ShowAllRight
BSR ClearAnaHeights
MOVE.B SaveDA,DisableAnalyzer
MOVE.B SaveScope,ScopeEnable
BSR RestorePtrCol
CLR.B RawKeyCode
RTS
ClrCancel
BSR.S RemoveClearBox
BRA SetErrorPtrCol
ClrAll BSR DoClearSong
BSR ClrSampleInfo
BSR SetNormalPtrCol
BSR.S RemoveClearBox
BRA DisplayMainAll
ClrSamples
BSR.S RemoveClearBox
BSR StopIt
BSR ClrSampleInfo
BSR SetNormalPtrCol
SF EdEnable
MOVE.W #1,InsNum
BRA DisplayMainAll
ClrSong BSR.S RemoveClearBox
BSR DoClearSong
BSR SetNormalPtrCol
BRA DisplayMainAll
ClrSampleInfo
BSR GiveBackInstrMem
MOVE.L SongDataPtr,A0
LEA sd_sampleinfo(A0),A0
MOVE.W #31*30-1,D0
csiloop CLR.B (A0)+
DBRA D0,csiloop
MOVE.L SongDataPtr,A1
LEA sd_sampleinfo(A1),A1
MOVEQ #30,D0
caloop2 MOVE.W #1,28(A1)
LEA 30(A1),A1
DBRA D0,caloop2
LEA SampleLengthAdd(PC),A3
MOVEQ #31,D0
csilop2 CLR.W (A3)+
DBRA D0,csilop2
JMP RedrawSample
DoClearSong
BSR StopIt
CLR.B RawKeyCode
MOVE.L SongDataPtr,A0
MOVE.L A0,A1
MOVEQ #19,D0
docla2x CLR.B (A0)+
DBRA D0,docla2x
MOVE.L A1,A2
ADD.L #70716,A2
ADD.L #950,A1
MOVEQ #0,D0
caloop MOVE.W D0,(A1)+
CMP.L A1,A2
BNE.S caloop
MOVE.L SongDataPtr,A0
MOVE.W #$017F,sd_numofpatt(A0)
MOVE.L #'M.K.',sd_mahokakt(A0) ; M.K. all the way...
SF EdEnable
CLR.L CurrPos
CLR.L SongPosition
CLR.L PatternPosition
CLR.L PatternPtr
CLR.L TimerTicks
CLR.W BlockMarkFlag
CLR.B MetroChannel
MOVE.W #1,EditMoveAdd
MOVEQ #0,D0
MOVE.W DefaultSpeed,D0
MOVE.L D0,CurrSpeed
MOVE.W Tempo,RealTempo
BSR SetTempo
BSR RestoreEffects2
BSR RestoreFKeyPos2
BSR UnmuteAll
MOVE.W #1,InsNum
MOVE.L #6,CurrSpeed
CLR.L PatternNumber
CLR.W ScrPattPos
BSR SetScrPatternPos
BRA RedrawPattern
UnmuteAll
MOVE.W #1,audchan1toggle
MOVE.W #1,audchan2toggle
MOVE.W #1,audchan3toggle
MOVE.W #1,audchan4toggle
MOVE.W #$000F,ActiveChannels
BRA RedrawToggles
ToggleMute
CLR.B RawKeyCode
TST.W ShiftKeyStatus
BEQ tomuskp
CLR.W audchan1toggle
CLR.W audchan2toggle
CLR.W audchan3toggle
CLR.W audchan4toggle
tomuskp MOVEQ #0,D0
MOVE.W PattCurPos,D0
DIVU #6,D0
MULU #11,D0
ADDQ.W #4,D0
BRA DoToggleMute
RestoreEffects
MOVEQ #0,D0
MOVE.W DefaultSpeed,D0
MOVE.L D0,CurrSpeed
MOVE.W Tempo,RealTempo
BSR SetTempo
BSR.S RestoreEffects2
CLR.B RawKeyCode
LEA EfxRestoredText(PC),A0
BSR ShowStatusText
BSR WaitALittle
BRA ShowAllRight
RestoreEffects2
LEA audchan1temp,A0
BSR.S reefsub
LEA audchan2temp,A0
BSR.S reefsub
LEA audchan3temp,A0
BSR.S reefsub
LEA audchan4temp,A0
reefsub CLR.B n_wavecontrol(A0)
CLR.B n_glissfunk(A0)
CLR.B n_finetune(A0)
CLR.B n_loopcount(A0)
RTS
RestoreFKeyPos
CLR.B RawKeyCode
LEA PosRestoredText(PC),A0
BSR ShowStatusText
BSR WaitALittle
BSR ShowAllRight
RestoreFKeyPos2
MOVE.W #00,F6pos
MOVE.W #16,F7pos
MOVE.W #32,F8pos
MOVE.W #48,F9pos
MOVE.W #63,F10pos
RTS
EfxRestoredText dc.b 'efx restored !',0
PosRestoredText dc.b 'pos restored !',0
GiveBackInstrMem
MOVEQ #1,D7
MOVE.L 4.W,A6
gbimloop
MOVE.W D7,D2
LSL.W #2,D2
LEA SamplePtrs,A0
MOVE.L 0(A0,D2.W),D1
BEQ.S gbimskip
MOVE.L 124(A0,D2.W),D0
CLR.L 0(A0,D2.W)
CLR.L 124(A0,D2.W)
MOVE.L D1,A1
JSR LVOFreeMem(A6)
gbimskip
ADDQ.W #1,D7
CMP.W #32,D7
BNE.S gbimloop
MOVE.W #1,UpdateFreeMem
JMP FreeCopyBuf
;---- Setup ----
Setup CMP.W #7,LastSetupScreen
BEQ Setup2
CLR.W LastSetupScreen
BSR WaitForButtonUp
MOVE.W #5,CurrScreen
ST DisableAnalyzer
ST NoSampleInfo
BSR Clear100Lines
BSR ShowSetupScreen
BEQ ExitSetup
RefreshSetup
BSR SetScreenColors
BSR Show_MS
CMP.W #5,CurrScreen
BNE Return1
BSR MarkColor
BSR ShowSetupToggles
BSR ShowSplit
BSR ShowPrintPath
BSR ShowKeyRepeat
BSR ShowExtCommand
BSR ShowMultiSetup
BSR ShowConfigNumber
BRA ShowAccidental ; Always last (redraws pattern) !
ShowSetupScreen
MOVE.L SetupMemPtr,D0
BNE DecompactSetup
BSR.S SaveMainPic
TST.L SetupMemPtr
BEQ Return1
BRA DecompactSetup
SaveMainPic
MOVE.L #8000,D0
MOVEQ #0,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,SetupMemPtr
BEQ OutOfMemErr
MOVE.L D0,A1
LEA BitplaneData,A0
MOVEQ #1,D2
sssloop1
MOVE.W #999,D0
sssloop2
MOVE.L (A0)+,(A1)+
DBRA D0,sssloop2
LEA 6240(A0),A0
DBRA D2,sssloop1
RTS
RestoreMainPic
MOVE.L SetupMemPtr,D0
BEQ Return1
MOVE.L D0,A1
LEA BitplaneData,A0
MOVEQ #1,D2
ssxloop1
MOVE.W #999,D0
ssxloop2
MOVE.L (A1)+,(A0)+
DBRA D0,ssxloop2
LEA 6240(A0),A0
DBRA D2,ssxloop1
MOVE.L SetupMemPtr,A1
CLR.L SetupMemPtr
MOVE.L #8000,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
RTS
SetupMemPtr dc.l 0
DecompactSetup2
LEA Setup2Data+4,A0
MOVE.L #Setup2Size-4-8,D0
BRA.S decoset
DecompactSetup
LEA SetupScreenData+4,A0
MOVE.L #SetupScreenSize-4-8,D0
decoset LEA BitplaneData,A1
MOVE.L A1,A2
LEA 4000(A2),A2
dcsloop MOVE.B (A0)+,D1
CMP.B #181,D1
BEQ.S DecodeIt2
MOVE.B D1,(A1)+
CMP.L A2,A1
BLO.S dcslop2
LEA 6240(A1),A1
MOVE.L #$FFFFFFFF,A2
dcslop2 SUBQ.L #1,D0
CMP.L #0,D0
BGT.S dcsloop
MOVEQ #-1,D0
RTS
DecodeIt2
MOVEQ #0,D1
MOVE.B (A0)+,D1
MOVE.B (A0)+,D2
dcdlop2 MOVE.B D2,(A1)+
CMP.L A2,A1
BLO.S dcdskp2
LEA 6240(A1),A1
MOVE.L #$FFFFFFFF,A2
dcdskp2 DBRA D1,dcdlop2
SUBQ.L #2,D0
BRA.S dcslop2
; Gadgets
CheckSetupGadgs
TST.L SplitAddress
BEQ.S csgskip
CLR.L SplitAddress
BSR ShowSplit
csgskip MOVEM.W MouseX2,D0/D1
CMP.W #210,D0
BHS SetupMenu3
CMP.W #108,D0
BHS.S SetupMenu2
;---- Menu 1 ----
CMP.W #11,D1
BLS LoadConfig
CMP.W #22,D1
BLS SaveConfig
CMP.W #33,D1
BLS ResetAll
CMP.W #44,D1
BLS ExtCommand
CMP.W #55,D1
BLS MultiSetup
CMP.W #66,D1
BLS SetRed
CMP.W #77,D1
BLS SetGreen
CMP.W #88,D1
BLS SetBlue
CMP.W #99,D1
BLS ColorGadgets
RTS
SetupMenu2
CMP.W #11,D1
BLS Return1
CMP.W #55,D1
BLS SetSplit
CMP.W #66,D1
BLS SetKeyRepeat
CMP.W #77,D1
BLS ToggleAccidental
CMP.W #88,D1
BLS PrintSong
CMP.W #99,D1
BLS EnterPrintPath
RTS
SetupMenu3
CMP.W #11,D1
BLS.S ExitOrClear
CMP.W #22,D1
BLS ToggleSplit
CMP.W #33,D1
BLS ToggleFilter
CMP.W #44,D1
BLS ToggleTransDel
CMP.W #55,D1
BLS ToggleShowDec
CMP.W #66,D1
BLS ToggleAutoDir
CMP.W #77,D1
BLS ToggleAutoExit
CMP.W #88,D1
BLS ToggleModOnly
CMP.W #99,D1
BLS ToggleMIDI
RTS
ExitOrClear
CMP.W #265,D0
BLS ClearSplit
CMP.W #306,D0
BHS Setup2
ExitSetup
BSR WaitForButtonUp
MOVE.W CurrScreen,LastSetupScreen
CLR.B RawKeyCode
CLR.L SplitAddress
BSR RestoreMainPic
SF NoSampleInfo
BSR SetupVUCols
BSR SetupAnaCols
BSR Clear100Lines
BRA DisplayMainAll
LastSetupScreen dc.w 0
ToggleSplit
EOR.B #1,SplitFlag
BRA ShowSetupToggles
ToggleFilter
BCHG #1,$BFE001
BRA ShowSetupToggles
ToggleTransDel
EOR.B #1,TransDelFlag
BRA.S ShowSetupToggles
ToggleShowDec
EOR.B #1,ShowDecFlag
MOVE.W #1,UpdateFreeMem
BRA.S ShowSetupToggles
ToggleAutoDir
EOR.B #1,AutoDirFlag
BRA.S ShowSetupToggles
ToggleAutoExit
EOR.B #1,AutoExitFlag
BRA.S ShowSetupToggles
ToggleModOnly
EOR.B #1,ModOnlyFlag
LEA FileNamesPtr(PC),A0
CLR.L 4(A0)
BRA.S ShowSetupToggles
ToggleMIDI
EOR.B #1,MIDIFlag
BSR.S ShowSetupToggles
tstmidi TST.B MIDIFlag
BNE OpenMIDI
BRA CloseMIDI
ClearSplit
BSR WaitForButtonUp
LEA ClearSplitText,A0
BSR AreYouSure
BNE Return1
LEA SplitData,A0
MOVEQ #15,D0
clsploop
CLR.B (A0)+
DBRA D0,clsploop
BRA ShowSplit
ShowSetupToggles
CLR.B RawKeyCode
BSR Show_MS
CMP.W #5,CurrScreen
BNE Return1
MOVE.B $BFE001,D0
LSR.B #1,D0
AND.B #1,D0
EOR.B #1,D0
MOVE.B D0,FilterFlag
LEA SplitFlag,A4
MOVE.W #3,TextLength
MOVEQ #7,D7
MOVE.W #636,D6
sstloop
MOVE.W D6,TextOffset
LEA ToggleOFFText(PC),A0
TST.B (A4)+
BEQ.S sstskip
LEA ToggleONText(PC),A0
sstskip
BSR ShowText2
ADD.W #440,D6
DBRA D7,sstloop
BRA WaitForButtonUp
ToggleONText2 dc.b ' '
ToggleONText dc.b 'on '
ToggleOFFText dc.b 'off '
ShowSplit
BSR CalculateSplit
CMP.W #5,CurrScreen
BNE Return1
LEA SplitData,A3
MOVE.L NoteNamesPtr,A4
MOVEQ #0,D5
MOVE.W #614,D6
CLR.W WordNumber
shsploop
MOVE.W D6,TextOffset
MOVE.B (A3,D5.W),WordNumber+1 ; instr
BSR PrintHexByte
ADDQ.W #4,D6
MOVE.W D6,D1
MOVEQ #0,D0
MOVE.B 1(A3,D5.W),D0 ; note
LSL.W #2,D0
LEA (A4,D0.W),A0
MOVEQ #4,D0
BSR ShowText3
ADDQ.L #5,D6
MOVE.W D6,D1
MOVEQ #0,D0
MOVE.B 2(A3,D5.W),D0 ; trans
LSL.W #2,D0
LEA (A4,D0.W),A0
MOVEQ #4,D0
BSR ShowText3
ADD.W #431,D6
ADDQ.W #4,D5
CMP.W #16,D5
BNE.S shsploop
RTS
CalculateSplit
LEA SplitTransTable,A0
LEA SplitInstrTable,A1
LEA SplitData,A2
MOVEQ #0,D0
casploop
MOVE.B D0,(A0,D0.W)
CLR.B (A1,D0.W)
ADDQ.W #1,D0
CMP.W #37,D0
BLS.S casploop
MOVE.B 1(A2),-(SP)
MOVE.B 1+4(A2),-(SP)
MOVE.B 1+8(A2),-(SP)
MOVE.B 1+12(A2),-(SP) ; note
MOVEQ #3,D4
caspbigloop
MOVEQ #127,D0
MOVEQ #0,D1
MOVEQ #0,D2
casploop2
CMP.B 1(A2,D1.W),D0 ; note
BLS.S caspskip
MOVE.L D1,D2
MOVE.B 1(A2,D1.W),D0 ; note
caspskip
ADDQ.W #4,D1
CMP.W #16,D1
BNE.S casploop2
MOVEQ #0,D0
MOVE.B 1(A2,D2.W),D0 ; note
MOVE.B #127,1(A2,D2.W) ; note
MOVE.B 2(A2,D2.W),D1 ; trans
casploop3
MOVE.B D1,(A0,D0.W)
MOVE.B (A2,D2.W),(A1,D0.W) ; instr
ADDQ.W #1,D1
CMP.W #36,D1
BLO.S caspskip2
MOVEQ #35,D1
caspskip2
ADDQ.W #1,D0
CMP.W #36,D0
BLO.S casploop3
DBRA D4,caspbigloop
MOVE.B (SP)+,1+12(A2)
MOVE.B (SP)+,1+8(A2)
MOVE.B (SP)+,1+4(A2)
MOVE.B (SP)+,1(A2) ; note
RTS
SetSplit
LEA SplitData,A2
SUBQ.W #1,D1
DIVU #11,D1
SUBQ.W #1,D1
MOVE.W D1,D7
LSL.W #2,D7
MULU #440,D1
ADD.W #600,D1
CMP.W #176,D0
BHS.S SetSplitTranspose
CMP.W #136,D0
BHS.S SetSplitNote
ADD.W #14,D1
MOVE.W D1,TextOffset
BSR GetHexByte
CMP.B #$1F,D0
BLS.S setskip
MOVE.B #$1F,D0
setskip MOVE.B D0,(A2,D7.W) ; instr
BRA ShowSplit
SetSplitNote
MOVE.L D1,-(SP)
BSR ShowSplit
MOVE.L (SP)+,D1
ADD.W #18,D1
MOVEQ #3,D0
LEA SpcNoteText,A0
BSR ShowText3
LEA 1(A2,D7.W),A0 ; note
MOVE.L A0,SplitAddress
BRA WaitForButtonUp
SetSplitTranspose
MOVE.L D1,-(SP)
BSR ShowSplit
MOVE.L (SP)+,D1
ADD.W #23,D1
MOVEQ #3,D0
LEA SpcNoteText,A0
BSR ShowText3
LEA 2(A2,D7.W),A0 ; trans
MOVE.L A0,SplitAddress
BRA WaitForButtonUp
SetKeyRepeat
CMP.W #188,D0
BHS.S skrep2
MOVE.W #2381,TextOffset
BSR GetHexByte
MOVE.B D0,KeyRepDelay+1
BRA.S ShowKeyRepeat
skrep2 MOVE.W #2384,TextOffset
BSR GetHexByte
MOVE.B D0,KeyRepSpeed+1
ShowKeyRepeat
MOVE.W #2381,TextOffset
MOVE.W KeyRepDelay,WordNumber
BSR PrintHexByte
ADDQ.W #1,TextOffset
MOVE.W KeyRepSpeed,WordNumber
BRA PrintHexByte
ToggleAccidental
MOVE.L #NoteNames1,NoteNamesPtr
EOR.B #1,Accidental
BEQ.S ShowAccidental
MOVE.L #NoteNames2,NoteNamesPtr
ShowAccidental
LEA AccidentalText(PC),A0
TST.B Accidental
BEQ.S shacskp
LEA AccidentalText+1(PC),A0
shacskp MOVEQ #1,D0
MOVE.W #2824,D1
BSR ShowText3
BRA RedrawPattern
AccidentalText dc.b '#¡'
LoadConfig
CMP.W #84,D0
BHS SetConfigNumber
LEA LoadConfigText,A0
BSR AreYouSure
BNE Return1
BSR WaitForButtonUp
LEA LoadingCfgText(PC),A0
BSR ShowStatusText
DoLoadConfig
BSR StorePtrCol
BSR PutConfigNumber
MOVE.L #Configname,D1
MOVE.L #1005,D2
MOVE.L DOSbase,A6
JSR LVOOpen(A6)
MOVE.L D0,D7
BNE.S cfgopok
LEA PTPath,A0
BSR CopyPath
LEA ConfigName(PC),A0
MOVEQ #12,D0
cfgnlop MOVE.B (A0)+,(A1)+
DBRA D0,cfgnlop
MOVE.L #FileName,D1
MOVE.L #1005,D2
MOVE.L DOSbase,A6
JSR LVOOpen(A6)
MOVE.L D0,D7
BEQ.S ConfigErr
cfgopok BSR SetDiskPtrCol
MOVE.L D7,D1
CLR.L ConfigID
MOVE.L #ConfigID,D2
MOVE.L #4,D3
JSR LVORead(A6)
CMP.L #"PT1.",ConfigID
BNE.S cfgerr2
LEA SetupData+4,A0
MOVE.L D7,D1
MOVE.L A0,D2
MOVE.L #ConfigFileSize-4,D3
JSR LVORead(A6)
lcfgend MOVE.L D7,D1
JSR LVOClose(A6)
BSR ShowAllRight
BSR RestorePtrCol
cfgupda BSR CopyCfgData
BSR tstmidi
BSR ChangeCopList
BRA RefreshSetup
ConfigErr
BSET #2,InitError
LEA FileNotFoundText(PC),A0
cferr BSR ShowStatusText
MOVE.W #50,WaitTime
BRA ErrorRestoreCol
cfgerr2 BSR.S ConfigErr2
BRA.S lcfgend
ConfigErr2
BSET #3,InitError
LEA NotAConfFileText(PC),A0
BRA.S cferr
ConfigErr3
LEA CantCreateFiText(PC),A0
BRA.S cferr
FileNotFoundText dc.b "config not found!",0
NotAConfFileText dc.b "not a config file",0
CantCreateFiText dc.b "can't create file",0
SaveConfig
CMP.W #84,D0
BHS SetConfigNumber
LEA SaveConfigText,A0
BSR AreYouSure
BNE Return1
BSR StorePtrCol
BSR SetDiskPtrCol
BSR PutConfigNumber
LEA SavingCfgText(PC),A0
BSR ShowStatusText
MOVE.L DOSbase,A6
LEA PTPath,A0
BSR CopyPath
LEA ConfigName(PC),A0
MOVEQ #12,D0
cfgllop MOVE.B (A0)+,(A1)+
DBRA D0,cfgllop
MOVE.L #FileName,D1
MOVE.L #1006,D2
JSR LVOOpen(A6)
MOVE.L D0,D7
BEQ ConfigErr3
MOVE.L D0,D1
MOVE.L #SetupData,D2
MOVE.W #ConfigFileSize,D3
JSR LVOWrite(A6)
MOVE.L D7,D1
JSR LVOClose(A6)
BSR ShowAllRight
BRA RestorePtrCol
SetConfigNumber
MOVE.W #611,TextOffset
BSR GetHexByte
MOVE.W D0,ConfigNumber
ShowConfigNumber
MOVE.W #611,TextOffset
MOVE.W ConfigNumber(PC),WordNumber
BRA PrintHexByte
PutConfigNumber
MOVE.W ConfigNumber(PC),D0
LEA ConfigName+12(PC),A0
BRA IntToHex2
ConfigName dc.b 'PT.config-00',0,0
ConfigNumber dc.w 0
LoadingCfgText dc.b 'loading config',0
SavingCfgText dc.b 'saving config',0,0
ConfigID dc.l 0
ResetAll
LEA ResetAllText,A0
BSR AreYouSure
BNE Return1
DoResetAll
LEA DefaultSetupData,A0
LEA SetupData,A1
MOVE.W #ConfigFileSize-1,D0
rsaloop MOVE.B (A0)+,(A1)+
DBRA D0,rsaloop
BRA RefreshSetup
ExtCommand
CMP.W #11,D0
BLO.S excolab
BSR StorePtrCol
BSR SetWaitPtrCol
LEA ExtCommands,A6
MOVE.W ExtCmdNumber,D1
MULU #32,D1
ADD.L D1,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #31,TextEndPtr
MOVE.W #11,TextLength
MOVE.W #1482,A4
BSR GetTextLine
BRA RestorePtrCol
ShowExtCommand
LEA ExtCommands,A0
MOVE.W ExtCmdNumber,D1
MULU #32,D1
ADD.L D1,A0
MOVEQ #11,D0
MOVE.W #1482,D1
BRA ShowText3
excolab BTST #2,$DFF016
BEQ.S excorun
ADDQ.W #1,ExtCmdNumber
AND.W #7,ExtCmdNumber
BSR.S ShowExtCommand
BSR Wait_4000
BSR Wait_4000
BSR Wait_4000
BRA Wait_4000
excorun LEA ExtCommands,A0
MOVE.W ExtCmdNumber,D1
MULU #32,D1
ADD.L D1,A0
TST.B (A0)
BEQ Return1
MOVE.L A0,ExtCmdAddress
MOVE.L IntuitionBase,A6
JSR LVOOpenWorkbench(A6)
JSR LVOWBenchToFront(A6)
MOVE.L #ExtCmdConsole,D1
MOVE.L #1005,D2
MOVE.L DOSBase,A6
JSR LVOOpen(A6)
MOVE.L D0,ExtCmdWindow
BEQ.S winderr
LSL.L #2,D0
MOVE.L D0,A0
MOVE.L PTProcess,A1
MOVE.L 8(A0),$A4(A1)
BSR GotoCLI
MOVE.L ExtCmdWindow,D1
BEQ Return1
MOVE.L DOSBase,A6
JSR LVOClose(A6)
CLR.L ExtCmdWindow
RTS
winderr LEA ConsoleErrText,A0
BSR ShowStatusText
BRA SetErrorPtrCol
ExtCmdNumber dc.w 0
ExtCmdAddress dc.l 0
ExtCmdWindow dc.l 0
ExtCmdConsole dc.b "CON:0/0/640/150/Protracker Output Window",0
ConsoleErrText dc.b "Can't open window",0,0
MultiSetup
CMP.W #44,D0
BLO Return1
BSR StorePtrCol
BSR SetWaitPtrCol
MOVE.W #1,GetLineFlag
SUB.W #44,D0
LSR.W #4,D0
MOVE.B D0,musepos
museset MOVEQ #0,D0
MOVE.B musepos,D0
MOVE.L D0,D1
LSL.W #4,D1
MOVE.W #52,LineCurX
MOVE.W #53,LineCurY
ADD.W D1,LineCurX
LEA MultiModeNext,A1
LEA (A1,D0.W),A1
BSR UpdateLineCurPos
muselop BSR GetHexKey
TST.B D1
BEQ.S musenul
CMP.B #4,D1
BHI.S muselop
MOVE.B D1,(A1)
BSR ShowMultiSetup
MOVEQ #1,D0
musenul TST.B D0
BEQ.S museabo
ADD.B D0,musepos
AND.B #3,musepos
BSR Wait_4000
BSR Wait_4000
BSR Wait_4000
BRA.S museset
museabo BSR RestorePtrCol
CLR.W GetLineFlag
MOVE.W #0,LineCurX
MOVE.W #270,LineCurY
BSR UpdateLineCurPos
ShowMultiSetup
MOVE.W #1926,TextOffset
MOVE.B MultiModeNext,D0
BSR PrintHexDigit
MOVE.W #1928,TextOffset
MOVE.B MultiModeNext+1,D0
BSR PrintHexDigit
MOVE.W #1930,TextOffset
MOVE.B MultiModeNext+2,D0
BSR PrintHexDigit
MOVE.W #1932,TextOffset
MOVE.B MultiModeNext+3,D0
BRA PrintHexDigit
musepos dc.b 0,0
SetRed CMP.W #82,D0
BHS SelectColor
setr2 BSR GetColPos
AND.W #$0F00,D2
LSR.W #8,D2
CMP.B D2,D0
BEQ.S setrskp
AND.W #$00FF,D1
LSL.W #8,D0
OR.W D0,D1
MOVE.W D1,(A0)
BSR ShowColSliders
BSR SetScreenColors
setrskp BTST #6,$BFE001
BEQ.S setr2
RTS
SetGreen
CMP.W #82,D0
BHS SelectColor
setg2 BSR.S GetColPos
AND.W #$00F0,D2
LSR.W #4,D2
CMP.B D2,D0
BEQ.S setgskp
AND.W #$0F0F,D1
LSL.W #4,D0
OR.W D0,D1
MOVE.W D1,(A0)
BSR ShowColSliders
BSR SetScreenColors
setgskp BTST #6,$BFE001
BEQ.S setg2
RTS
SetBlue CMP.W #82,D0
BHS SelectColor
setb2 BSR.S GetColPos
AND.W #$000F,D2
CMP.B D2,D0
BEQ.S setbskp
AND.W #$0FF0,D1
OR.W D0,D1
MOVE.W D1,(A0)
BSR ShowColSliders
BSR SetScreenColors
setbskp BTST #6,$BFE001
BEQ.S setb2
RTS
GetColPos
MOVEQ #0,D0
MOVE.W MouseX,D0
CMP.W #26,D0
BHS.S gcpskp2
MOVEQ #0,D0
BRA.S gcpskip
gcpskp2 SUB.W #26,D0
DIVU #3,D0
AND.L #$FF,D0
CMP.W #15,D0
BLS.S gcpskip
MOVEQ #15,D0
gcpskip CMP.W #7,CurrScreen
BEQ GetColAddr
LEA ColorTable,A0
MOVE.W CurrColor,D1
ADD.W D1,D1
LEA (A0,D1.W),A0
MOVE.W (A0),D1
MOVE.W D1,D2
RTS
ShowColSliders
LEA ColSliders(PC),A2
MOVE.L TextBplPtr,A1
ADD.L #3282,A1
BSR.S gcpskip
AND.W #$000F,D1
BSR.S ShowOneSlider
MOVE.L TextBplPtr,A1
ADD.L #2842,A1
BSR.S gcpskip
AND.W #$00F0,D1
LSR.W #4,D1
BSR.S ShowOneSlider
MOVE.L TextBplPtr,A1
ADD.L #2402,A1
BSR.S gcpskip
AND.W #$0F00,D1
LSR.W #8,D1
ShowOneSlider
CLR.L (A1)
CLR.L 4(A1)
CLR.L 40(A1)
CLR.L 44(A1)
CLR.L 80(A1)
CLR.L 84(A1)
MOVE.W D1,D3
ADD.W D3,D3
ADD.W D3,D3
MOVE.W 2(A2,D3.W),D4
MOVE.B 0(A2,D3.W),00(A1,D4.W)
MOVE.B 1(A2,D3.W),01(A1,D4.W)
MOVE.B 0(A2,D3.W),40(A1,D4.W)
MOVE.B 1(A2,D3.W),41(A1,D4.W)
MOVE.B 0(A2,D3.W),80(A1,D4.W)
MOVE.B 1(A2,D3.W),81(A1,D4.W)
RTS
ColSliders
dc.w %0000000001111100,0
dc.w %0000111110000000,1
dc.w %0000000111110000,1
dc.w %0000000000111110,1
dc.w %0000011111000000,2
dc.w %0000000011111000,2
dc.w %0000000000011111,2
dc.w %0000001111100000,3
dc.w %0000000001111100,3
dc.w %0000111110000000,4
dc.w %0000000111110000,4
dc.w %0000000000111110,4
dc.w %0000011111000000,5
dc.w %0000000011111000,5
dc.w %0000000000011111,5
dc.w %0000001111100000,6
SelectColor
CMP.W #84,D1
BHS Return1
MOVE.L TextBplPtr,A0
LEA 2410(A0),A0
MOVEQ #24,D2
slcloop CLR.L (A0)
LEA 40(A0),A0
DBRA D2,slcloop
SUB.W #82,D0
DIVU #13,D0
SUB.W #60,D1
DIVU #6,D1
MOVE.W D0,D2
LSL.W #2,D2
ADD.W D1,D2
MOVE.W D2,CurrColor
MarkColor
BSR gcpskip
MOVE.L A0,UndoColAddr
MOVE.W D1,UndoCol
BSR ShowColSliders
BSR.S BlockColors
MOVE.W CurrColor,D0
MOVE.W D0,D1
AND.W #$0003,D1
MULU #6*40,D1
MOVE.L TextBplPtr,A0
ADD.L D1,A0
LEA 2410(A0),A0
BTST #2,D0
BNE.S slcskip
MOVE.W #$3FF0,(A0)
MOVE.W #$3FF0,240(A0)
MOVEQ #4,D0
slclop2 LEA 40(A0),A0
MOVE.W #$2010,(A0)
DBRA D0,slclop2
BRA WaitForButtonUp
slcskip MOVE.L #$0001FF80,(A0)
MOVE.L #$0001FF80,240(A0)
MOVEQ #4,D0
slclop3 LEA 40(A0),A0
MOVE.L #$0001FF80,(A0)
DBRA D0,slclop3
BRA WaitForButtonUp
BlockColors
MOVE.L TextBplPtr,A0
LEA 2452(A0),A0
MOVEQ #3,D1
suploop2
MOVEQ #4,D0
suploop3
MOVE.B #$FF,(A0)
ADD.L #40,A0
DBRA D0,suploop3
ADD.L #40,A0
DBRA D1,suploop2
RTS
ColorGadgets
CMP.W #79,D0
BHS SetDefaultCol
CMP.W #33,D0
BHS.S CancelCol
MOVE.L UndoColAddr,A0
MOVE.W UndoCol,D0
MOVE.W (A0),UndoCol
MOVE.W D0,(A0)
BSR ShowColSliders
BRA SetScreenColors
CancelCol
LEA CanCols(PC),A0
LEA ColorTable,A1
MOVEQ #7,D0
cacolop MOVE.W (A0)+,(A1)+
DBRA D0,cacolop
BSR ShowColSliders
BRA SetScreenColors
CopyCfgData
LEA ColorTable,A0
LEA CanCols(PC),A1
MOVEQ #7,D0
cocclop MOVE.W (A0)+,(A1)+
DBRA D0,cocclop
LEA ModulesPath2,A0
MOVE.W #195,D0
cocclp2 CLR.B (A0)+
DBRA D0,cocclp2
LEA ModulesPath,A0
LEA ModulesPath2,A1
BSR.S cocclp3
LEA SongsPath,A0
LEA SongsPath2,A1
BSR.S cocclp3
LEA SamplePath,A0
LEA SamplePath2,A1
cocclp3 MOVE.B (A0)+,(A1)+
BNE.S cocclp3
LEA VUMeterColors,A0
LEA SaveColors,A1
MOVEQ #40+48-1,D0
cocclp4 MOVE.W (A0)+,(A1)+
DBRA D0,cocclp4
RTS
UndoCol dc.w 0
UndoColAddr dc.l 0
CanCols dc.w 0,0,0,0,0,0,0,0
SetDefaultCol
LEA DefCol,A0
LEA ColorTable,A1
MOVEQ #7,D0
sdcloop MOVE.W (A0)+,(A1)+
DBRA D0,sdcloop
BSR ShowColSliders
SetScreenColors
BSR SetupAnaCols
SetScreenColors2
LEA ColorTable,A0
LEA CopCol0,A1
MOVE.W (A0),(A1)
MOVE.W 2(A0),4(A1)
MOVE.W 4(A0),8(A1)
MOVE.W 6(A0),12(A1)
MOVE.W 8(A0),16(A1)
MOVE.W 10(A0),20(A1)
MOVE.W 12(A0),24(A1)
MOVE.W 14(A0),28(A1)
MOVE.W 14(A0),D0
TST.W SamScrEnable
BEQ.S sscnosc
MOVE.W 8(A0),D0
sscnosc MOVE.W D0,NoteCol
MOVE.W 10(A0),D0
MOVE.W D0,D4
MOVE.W #3,FadeX
BSR.S FadeCol
MOVE.W D0,32(A1)
MOVE.W D4,36(A1)
MOVE.W D4,D0
MOVE.W #-3,FadeX
BSR.S FadeCol
MOVE.W D0,40(A1)
RTS
FadeCol MOVE.W D0,D1
MOVE.W D0,D2
MOVE.W D0,D3
LSR.W #8,D1
ADD.W FadeX(PC),D1
BPL.S redskp
MOVEQ #0,D1
redskp CMP.W #15,D1
BLS.S redskp2
MOVEQ #15,D1
redskp2 AND.W #$00F0,D2
LSR.W #4,D2
ADD.W FadeX(PC),D2
BPL.S grnskp
MOVEQ #0,D2
grnskp CMP.W #15,D2
BLS.S grnskp2
MOVEQ #15,D2
grnskp2 AND.W #$000F,D3
ADD.W FadeX(PC),D3
BPL.S bluskp
MOVEQ #0,D3
bluskp CMP.W #15,D3
BLS.S bluskp2
MOVEQ #15,D3
bluskp2 MOVE.W D3,D0
LSL.W #4,D2
OR.W D2,D0
LSL.W #8,D1
OR.W D1,D0
RTS
CurrColor dc.w 0
FadeX dc.w -3
EnterPrintPath
BSR StorePtrCol
BSR SetWaitPtrCol
LEA PrintPath,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #31,TextEndPtr
MOVE.W #12,TextLength
MOVE.W #3694,A4
BSR GetTextLine
BRA RestorePtrCol
ShowPrintPath
LEA PrintPath,A0
MOVE.W #3694,D1
MOVEQ #12,D0
BRA ShowText3
; Print Song
PrintSong
LEA PrintSongText,A0
BSR AreYouSure
BNE Return1
BSR StorePtrCol
MOVE.L #PrintPath,D1
MOVE.L #1006,D2
MOVE.L DOSbase,A6
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BEQ CantOpenFile
BSR SetDiskPtrCol
LEA PrintingSongText,A0
BSR ShowStatusText
MOVE.L FileHandle,D1
MOVE.L #SongDumpText,D2
MOVEQ #68,D3
MOVE.L DOSbase,A6
JSR LVOWrite(A6)
MOVE.L FileHandle,D1
MOVE.L SongDataPtr,D2
MOVEQ #20,D3
JSR LVOWrite(A6)
BSR PrintCRLF
BSR PrintCRLF
BSR PrintSong2
BSR PrintCRLF
BSR PrintSong4
BSR PrintFormFeed
MOVE.L SongDataPtr,A0
MOVEQ #0,D0
MOVE.B sd_numofpatt(A0),D0
LEA sd_pattpos(A0),A0
MOVEQ #0,D7
ps_loop CMP.B (A0,D0.W),D7
BGT.S ps_skip
MOVE.B (A0,D0.W),D7
ps_skip SUBQ.W #1,D0
BPL.S ps_loop
MOVEQ #0,D1
ps_loop2
MOVEM.L D1-D7/A0-A6,-(SP)
BSR PrintPattern
MOVEM.L (SP)+,D1-D7/A0-A6
TST.L D0
BNE.S ps_skip2
MOVEM.L D1/D7,-(SP)
BSR PrintFormFeed
MOVEM.L (SP)+,D1/D7
ADDQ.W #1,D1
CMP.W D7,D1
BLO.S ps_loop2
ps_skip2
MOVE.L DOSbase,A6
MOVE.L FileHandle,D1
JSR LVOClose(A6)
BSR ShowAllRight
BRA RestorePtrCol
PrintSong2
MOVEQ #1,D7
ps2_2 MOVE.L D7,D0
LSR.B #4,D0
CMP.B #9,D0
BLS.S spujk
ADDQ.B #7,D0
spujk ADD.B #'0',D0
MOVE.B D0,PattXText1
MOVE.B D7,D0
AND.B #$0F,D0
CMP.B #9,D0
BLS.S spujk2
ADDQ.B #7,D0
spujk2 ADD.B #'0',D0
MOVE.B D0,PattXText2
MOVE.L SongDataPtr,A0
MOVE.W D7,D0
MULU #30,D0
LEA -10(A0,D0.W),A0
LEA PpText,A1
MOVEQ #21,D0
ps2_loop
MOVE.B #' ',(A1)+
DBRA D0,ps2_loop
LEA PpText,A1
MOVE.L A0,SavIt
ps2_loop2
MOVE.B (A0)+,D0
BEQ PrintSong3
MOVE.B D0,(A1)+
BRA.S ps2_loop2
SavIt dc.l 0
PrintSong3
MOVE.L D7,-(SP) ; pattnum
MOVE.L SavIt(PC),A0
MOVE.W 22(A0),D0
ADD.W D0,D0
LEA Prafs+2+4,A0
BSR IntToHexASCII
MOVE.L SavIt(PC),A0
MOVE.W 26(A0),D0
ADD.W D0,D0
LEA Prafs+8+4,A0
BSR IntToHexASCII
MOVE.L SavIt(PC),A0
MOVE.W 28(A0),D0
ADD.W D0,D0
LEA Prafs+14+4,A0
BSR IntToHexASCII
MOVE.L DOSbase,A6
MOVE.L FileHandle,D1
MOVE.L #PtotText,D2
MOVEQ #52,D3
JSR LVOWrite(A6)
MOVE.L (SP)+,D7
ADDQ.W #1,D7
CMP.W #$0020,D7
BNE ps2_2
RTS
PrintSong4
MOVE.L SongDataPtr,A0
MOVEQ #0,D7
MOVE.B sd_numofpatt(A0),D7
LEA sd_pattpos(A0),A0
MOVEQ #0,D5
ps4_loop1
MOVEQ #0,D6
ps4_loop2
MOVEQ #0,D0
MOVE.B (A0)+,D0
MOVE.W D0,D1
LSR.W #4,D1
ADD.B #$30,D1
CMP.B #$39,D1
BLS.S ps4_skip
ADDQ.B #7,D1
ps4_skip
AND.B #15,D0
ADD.B #$30,D0
CMP.B #$39,D0
BLS.S ps4_skip2
ADDQ.B #7,D0
ps4_skip2
LEA PnText,A1
MOVE.B D1,(A1)+
MOVE.B D0,(A1)
MOVEM.L D5-D7/A0,-(SP)
MOVE.L DOSbase,A6
MOVE.L FileHandle,D1
MOVE.L #PnText,D2
MOVEQ #4,D3
JSR LVOWrite(A6)
MOVEM.L (SP)+,D5-D7/A0
ADDQ.W #1,D5
CMP.W D5,D7
BEQ Return1
ADDQ.W #1,D6
CMP.W #$0010,D6
BNE.S ps4_loop2
MOVEM.L D5-D7/A0,-(SP)
BSR.S PrintCRLF
MOVEM.L (SP)+,D5-D7/A0
BRA.S ps4_loop1
PrintCRLF
MOVE.L DOSbase,A6
MOVE.L FileHandle,D1
MOVE.L #CRLF_Text,D2
MOVEQ #2,D3
JSR LVOWrite(A6)
RTS
PrintFormFeed
MOVE.L DOSbase,A6
MOVE.L FileHandle,D1
MOVE.L #FF_Text,D2
MOVEQ #1,D3
JSR LVOWrite(A6)
RTS
PrintPattern
MOVE.L D1,D6 ; D1=pattern number
DIVU #10,D6
ADD.B #'0',D6
MOVE.B D6,PattNumText1
SWAP D6
ADD.B #'0',D6
MOVE.B D6,PattNumText2
MOVEM.L D0-D7/A0-A6,-(SP)
MOVE.L FileHandle,D1
MOVE.L #PatternNumText,D2
MOVEQ #18,D3
MOVE.L DOSbase,A6
JSR LVOWrite(A6)
MOVEM.L (SP)+,D0-D7/A0-A6
MOVE.L D1,D6
MOVE.L SongDataPtr,A6
LEA sd_patterndata(A6),A6
LSL.L #8,D6
LSL.L #2,D6
ADD.L D6,A6
CLR.L PPattPos
MOVEQ #0,D6
pp_posloop
MOVEQ #0,D7
MOVE.W #2,TextLength
MOVE.L PPattPos,D1
LEA PattPosText,A5
DIVU #10,D1
ADD.B #'0',D1
MOVE.B D1,(A5)+
CLR.W D1
SWAP D1
ADD.B #'0',D1
MOVE.B D1,(A5)+
ADDQ.L #5,A5
pp_noteloop
MOVEQ #0,D0
MOVEQ #0,D1
MOVE.W #3,TextLength
MOVE.W (A6),D1
AND.W #$0FFF,D1
LEA PeriodTable,A0
pp_findloop
CMP.W 0(A0,D0.L),D1
BEQ PrintNote
ADDQ.L #2,D0
BRA.S pp_findloop
PrintNote
ADD.L D0,D0
ADD.L NoteNamesPtr,D0
MOVE.L D0,A0
MOVE.L (A0),(A5)+
CMP.B #'¡',-3(A5)
BNE.S prnoxyz
MOVE.B #'b',-3(A5)
prnoxyz ADDQ.L #1,A5
MOVEQ #0,D0
MOVE.W (A6),D0
AND.W #$F000,D0
LSR.W #8,D0
LSL.L #1,D0
LEA FastHexTable,A0
ADD.L D0,A0
MOVE.B (A0),(A5)+
MOVEQ #0,D0
MOVE.B 2(A6),D0
LSL.L #1,D0
LEA FastHexTable,A0
ADD.L D0,A0
MOVE.W (A0),(A5)+
MOVEQ #0,D0
MOVE.B 3(A6),D0
LSL.L #1,D0
LEA FastHexTable,A0
ADD.L D0,A0
MOVE.W (A0),(A5)+
ADDQ.L #4,A5
ADDQ.L #4,A6
ADDQ.L #1,D7
CMP.L #4,D7
BNE pp_noteloop
ADDQ.L #1,PPattPos
MOVEM.L D0-D7/A0-A6,-(SP)
MOVE.L DOSbase,A6
MOVE.L FileHandle,D1
MOVE.L #PnText2,D2
MOVEQ #68,D3
JSR LVOWrite(A6)
BSR PrintCRLF
MOVEM.L (SP)+,D0-D7/A0-A6
BTST #2,$DFF016
BEQ.S NegativeReturn
ADDQ.L #1,D6
CMP.L #64,D6
BNE pp_posloop
MOVEQ #0,D0
RTS
NegativeReturn
MOVEQ #-1,D0
RTS
PositiveReturn
MOVEQ #0,D0
RTS
;---- Setup2 ----
Setup2 BSR WaitForButtonUp
MOVE.W #7,CurrScreen
CLR.W LastSetupScreen
ST DisableAnalyzer
ST NoSampleInfo
BSR Clear100Lines
MOVE.L SetupMemPtr,D0
BNE set2skp
BSR SaveMainPic
BEQ ExitSetup
set2skp BSR DecompactSetup2
BSR SetScreenColors
refrsh2 BSR ShowIntMode
BSR ShowTempo
BSR ShowSpeed
BSR ShowColEdit
BSR ShowRainbow
BSR GetColPos
BSR ShowColSliders
BSR ShowS2Modules
BSR ShowS2Songs
BSR ShowS2Samples
BSR ShowS2PTPath
BSR ShowS2MaxPLST
BSR ShowS2DMAWait
BSR ShowS2TuneNote
BSR ShowS2SalvAddr
BRA ShowS2T
CheckSetup2Gadgs
MOVEM.W MouseX2,D0/D1
CMP.W #210,D0
BHS Setup2Menu3
CMP.W #108,D0
BHS.S Setup2Menu2
;---- Menu 1 ----
CMP.W #11,D1
BLS ToggleIntMode
CMP.W #22,D1
BLS ChangeTempo
CMP.W #33,D1
BLS ChangeSpeed
CMP.W #44,D1
BLS ToggleColEdit
CMP.W #55,D1
BLS RotOrSpread
CMP.W #66,D1
BLS SetRed2
CMP.W #77,D1
BLS SetGreen2
CMP.W #88,D1
BLS SetBlue2
CMP.W #99,D1
BLS ColorGadgets2
RTS
Setup2Menu2
CMP.W #11,D1
BLS Set2ModPath
CMP.W #22,D1
BLS Set2SongPath
CMP.W #33,D1
BLS Set2SamPath
CMP.W #44,D1
BLS Set2PTPath
CMP.W #55,D1
BLS SetS2MaxPLST
CMP.W #66,D1
BLS SetS2DMAWait
CMP.W #77,D1
BLS SetS2TuneNote
CMP.W #88,D1
BLS SetS2SalvAddr
CMP.W #99,D1
BLS RecoverSong
RTS
Setup2Menu3
CMP.W #11,D1
BLS ExitOrDefault
CMP.W #22,D1
BLS ToggleOverride
CMP.W #33,D1
BLS ToggleNosamples
CMP.W #44,D1
BLS ToggleBlankZero
CMP.W #55,D1
BLS ToggleShowDirs
CMP.W #66,D1
BLS ToggleShowPublic
CMP.W #77,D1
BLS ToggleCutToBuf
CMP.W #88,D1
BLS ToggleIFFLoop
CMP.W #99,D1
BLS ToggleHH
RTS
ExitOrDefault
CMP.W #265,D0
BLS.S SetS2Default
CMP.W #306,D0
BHS Setup
BRA ExitSetup
SetS2Default
LEA SetDefaultsText(PC),A0
BSR AreYouSure
BNE Return1
LEA DefaultSetupData,A0
LEA SongsPath-SetupData(A0),A2
LEA SongsPath,A1
MOVEQ #95,D0
ss2dela MOVE.B (A2)+,(A1)+
DBRA D0,ss2dela
LEA PTPath-SetupData(A0),A2
LEA PTPath,A1
MOVEQ #31,D0
ss2delb MOVE.B (A2)+,(A1)+
DBRA D0,ss2delb
LEA MaxPLSTEntries-SetupData(A0),A2
MOVE.W (A2),MaxPLSTEntries
LEA DMAWait-SetupData(A0),A2
MOVE.W (A2),DMAWait
LEA TuneNote-SetupData(A0),A2
MOVE.L (A2),TuneNote
LEA SalvageAddress-SetupData(A0),A2
LEA SalvageAddress,A1
MOVE.L (A2)+,(A1)+
MOVE.L (A2),(A1)
BRA refrsh2
SetDefaultsText dc.b "Set defaults?",0
ToggleIntMode
BSR ResetMusicInt
EOR.B #1,IntMode
BSR SetMusicInt
BSR SetTempo
BSR WaitForButtonUp
ShowIntMode
LEA VBlankText(PC),A0
TST.B IntMode
BEQ.S simskip
LEA CIAText(PC),A0
simskip MOVEQ #6,D0
MOVE.W #167,D1
BRA ShowText3
VBlankText dc.b "VBLANK"
CIAText dc.b " CIA "
ChangeSpeed
MOVEQ #0,D1
CMP.W #94,D0
BHS.S SpeedDown
CMP.W #80,D0
BHS.S SpeedUp
RTS
SpeedUp MOVE.W DefaultSpeed,D1
ADDQ.B #1,D1
CMP.B #$FF,D1
BLS.S spedup2
MOVE.W #$FF,D1
spedup2 MOVE.W D1,DefaultSpeed
MOVE.L D1,CurrSpeed
BSR.S ShowSpeed
BSR Wait_4000
BRA Wait_4000
ShowSpeed
MOVE.W #608+440,TextOffset
MOVE.W DefaultSpeed,WordNumber
JMP PrintHexByte
SpeedDown
MOVE.W DefaultSpeed,D1
SUB.B #1,D1
CMP.B #1,D1
BHS.S spedup2
MOVEQ #1,D1
BRA.S spedup2
ToggleOverride
EOR.B #1,OverrideFlag
BRA.S ShowS2T
ToggleNosamples
EOR.B #1,NosamplesFlag
BRA.S ShowS2T
ToggleBlankZero
EOR.B #1,BlankZeroFlag
BSR.S ShowS2T
BRA RedrawPattern
ToggleShowDirs
EOR.B #1,ShowDirsFlag
BRA.S ShowS2T
ToggleShowPublic
EOR.B #1,ShowPublicFlag
MOVE.W #1,UpdateFreeMem
BRA.S ShowS2T
ToggleCutToBuf
EOR.B #1,CutToBufFlag
BRA.S ShowS2T
ToggleIFFLoop
EOR.B #1,IFFLoopFlag
BRA.S ShowS2T
ToggleHH
EOR.B #1,HHFlag
ShowS2T CLR.B RawKeyCode
CMP.W #7,CurrScreen
BNE Return1
LEA OverrideFlag,A4
MOVE.W #3,TextLength
MOVEQ #7,D7
MOVE.W #636,D6
sstloop2
MOVE.W D6,TextOffset
LEA ToggleOFFText,A0
TST.B (A4)+
BEQ.S sstskip2
LEA ToggleONText,A0
sstskip2
BSR ShowText2
ADD.W #440,D6
DBRA D7,sstloop2
BRA WaitForButtonUp
ShowS2Modules
MOVE.W #177,D1
LEA ModulesPath,A0
s2path MOVEQ #9,D0
BRA ShowText3
ShowS2Songs
MOVE.W #177+440,D1
LEA SongsPath,A0
BRA.S s2path
ShowS2Samples
MOVE.W #177+880,D1
LEA SamplePath,A0
BRA.S s2path
ShowS2PTPath
MOVE.W #177+1320,D1
LEA PTPath,A0
BRA.S s2path
Set2ModPath
BSR StorePtrCol
BSR SetWaitPtrCol
LEA ModulesPath,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #31,TextEndPtr
MOVE.W #9,TextLength
MOVE.W #177,A4
BSR GetTextLine
BRA RestorePtrCol
Set2SongPath
BSR StorePtrCol
BSR SetWaitPtrCol
LEA SongsPath,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #31,TextEndPtr
MOVE.W #9,TextLength
MOVE.W #177+440,A4
BSR GetTextLine
BRA RestorePtrCol
Set2SamPath
BSR StorePtrCol
BSR SetWaitPtrCol
LEA SamplePath,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #31,TextEndPtr
MOVE.W #9,TextLength
MOVE.W #177+880,A4
BSR GetTextLine
BRA RestorePtrCol
Set2PTPath
BSR StorePtrCol
BSR SetWaitPtrCol
LEA PTPath,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #31,TextEndPtr
MOVE.W #9,TextLength
MOVE.W #177+1320,A4
BSR GetTextLine
BRA RestorePtrCol
SetS2MaxPLST
CMP.W #199,D0
BHS.S S2plstd
CMP.W #188,D0
BHS.S S2PLSTu
RTS
S2PLSTu MOVE.W MaxPLSTEntries,D0
ADD.W #100,D0
CMP.W #9999,D0
BLS.S s2pu
MOVE.W #9999,D0
s2pu MOVE.W D0,MaxPLSTEntries
BSR.S ShowS2MaxPLST
BRA Wait_4000
S2PLSTd MOVEQ #0,D0
MOVE.W MaxPLSTEntries,D0
ADDQ.W #1,D0
DIVU #100,D0
SUBQ.W #1,D0
BPL.S s2pd
MOVEQ #0,D0
BRA.S s2pu
s2pd MULU #100,D0
BRA.S s2pu
ShowS2MaxPLST
MOVE.W MaxPLSTEntries,WordNumber
MOVE.W #1939,TextOffset
BRA Print4DecDigits
SetS2DMAWait
CMP.W #199,D0
BHS.S S2dwd
CMP.W #188,D0
BHS.S S2dwu
RTS
S2dwu MOVE.W DMAWait,D0
ADDQ.W #1,D0
BTST #2,$DFF016
BNE.S s2npu
ADD.W #9,D0
s2npu CMP.W #9999,D0
BLS.S s2du
MOVE.W #9999,D0
s2du MOVE.W D0,DMAWait
BSR.S ShowS2DMAWait
BRA Wait_4000
S2dwd MOVE.W DMAWait,D0
SUBQ.W #1,D0
BTST #2,$DFF016
BNE.S s2npd
SUB.W #9,D0
s2npd TST.W D0
BPL.S s2du
MOVEQ #0,D0
BRA.S s2du
ShowS2DMAWait
MOVE.W DMAWAit,WordNumber
MOVE.W #2379,TextOffset
BRA Print4DecDigits
SetS2TuneNote
CMP.W #187,D0
BHS.S ss2tvol
MOVE.W #2820,D1
MOVEQ #3,D0
LEA SpcNoteText,A0
BSR ShowText3
MOVE.W #3,SamNoteType
MOVE.L #TuneNote,SplitAddress
BRA WaitForButtonUp
ShowS2TuneNote
CMP.W #7,CurrScreen
BNE Return1
MOVE.L NoteNamesPtr,A4
MOVE.W TuneNote,D0
LSL.W #2,D0
LEA (A4,D0.W),A0
MOVEQ #4,D0
MOVE.W #2820,D1
BSR ShowText3
MOVE.W TToneVol,WordNumber
MOVE.W #2824,TextOffset
BRA PrintHexByte
ss2tvol MOVE.W #2824,TextOffset
BSR GetHexByte
MOVE.W D0,TToneVol
BRA.S ShowS2TuneNote
SetS2SalvAddr
BRA ShowNotImpl
BSR StorePtrCol
BSR SetWaitPtrCol
LEA SalvageAddress,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #6,TextEndPtr
MOVE.W #6,TextLength
MOVE.W #3260,A4
MOVE.B #5,EnterTextFlag
BSR GetTextLine
CLR.B EnterTextFlag
BSR RestorePtrCol
ShowS2SalvAddr
LEA SalvageAddress,A0
MOVEQ #6,D0
MOVE.W #3260,D1
BRA ShowText3
RecoverSong
BRA ShowNotImpl
LEA RecoverSongText(PC),A0
BSR AreYouSure
BNE Return1
BSR DoClearSong
BSR ClrSampleInfo
BSR.S FindAdr
MOVE.L D0,A0
MOVE.L SongDataPtr,A1
MOVE.L #70716,D0
recloop MOVE.B (A0)+,(A1)+
SUBQ.L #1,D0
BNE.S recloop
BRA RedrawPattern
FindAdr LEA SalvageAddress+6,A0
BSR HexToInteger
MOVE.W D0,D3
MOVEQ #0,D0
BSR HexToInteger2
SWAP D0
OR.W D3,D0
RTS
RecoverSongText dc.b "Recover Song?",0
ToggleColEdit
CMP.W #79,D0
BHS SelectColor2
CLR.W SpreadFlag
LEA VUMeterColors,A0
MOVEQ #48,D0
CMP.L TheRightColors(PC),A0
BNE.S tced2
LEA AnalyzerColors,A0
MOVEQ #36,D0
tced2 MOVE.L A0,TheRightColors
MOVE.W D0,ColorsMax
CMP.W RainbowPos(PC),D0
BHI.S tced3
CLR.W RainbowPos
tced3 BSR ShowRainbow
BSR.S ShowColEdit
BRA WaitForButtonUp
ShowColEdit
LEA cedtxt1(PC),A0
LEA VUMeterColors,A1
CMP.L TheRightColors(PC),A1
BEQ.S shcoed
LEA cedtxt2(PC),A0
shcoed MOVEQ #6,D0
MOVE.W #1483,D1
BRA ShowText3
cedtxt1 dc.b "VU-MTR"
cedtxt2 dc.b "ANALYZ"
RotOrSpread
CMP.W #16,D0
BLO.S RotColUp
CMP.W #32,D0
BLO.S RotColDown
CMP.W #79,D0
BHS SelectColor2
BRA SpreadColors
RotColUp
CLR.W SpreadFlag
MOVE.L TheRightColors(PC),A0
MOVE.W (A0),D0
MOVE.W ColorsMax(PC),D1
SUBQ.W #2,D1
rocoup1 MOVE.W 2(A0),(A0)+
DBRA D1,rocoup1
MOVE.W D0,(A0)
rocoup2 BSR GetColPos
BSR ShowColSliders
BSR ShowRainbow
BRA SetupVUCols
RotColDown
CLR.W SpreadFlag
MOVE.L TheRightColors(PC),A0
MOVE.W ColorsMax(PC),D1
ADD.W D1,A0
ADD.W D1,A0
MOVE.W -(A0),D0
SUBQ.W #2,D1
rocodn1 MOVE.W -2(A0),(A0)
SUBQ.L #2,A0
DBRA D1,rocodn1
MOVE.W D0,(A0)
BRA.S rocoup2
SpreadColors
MOVE.W RainbowPos,SpreadFrom
MOVE.W #1,SpreadFlag
RTS
SpreadFrom dc.w 0
SpreadFlag dc.w 0
ColorGadgets2
CLR.W SpreadFlag
CMP.W #79,D0
BHS.S SetDefaultCol2
CMP.W #33,D0
BHS.S CancelCol2
MOVE.L UndoColAddr,A0
MOVE.W UndoCol,D1
MOVE.W (A0),UndoCol
MOVE.W D1,(A0)
BRA rocoup2
SetDefaultCol2
MOVE.L TheRightColors(PC),A0
MOVE.L A0,A1
SUB.L #SetupData,A1
ADD.L #DefaultSetupData,A1
sedeco4 MOVE.W ColorsMax,D0
BRA.S sedeco3
sedeco2 MOVE.W (A1)+,(A0)+
sedeco3 DBRA D0,sedeco2
BRA rocoup2
CancelCol2
MOVE.L TheRightColors(PC),A0
MOVE.L A0,A1
SUB.L #VUMeterColors,A1
ADD.L #SaveColors,A1
BRA.S sedeco4
GetColAddr
MOVE.L TheRightColors(PC),A0
MOVE.W RainbowPos,D1
ADD.W D1,D1
LEA (A0,D1.W),A0
MOVE.W (A0),D1
MOVE.W D1,D2
RTS
SetRed2 CMP.W #79,D0
BHS SelectColor2
set2r2 BSR GetColPos
AND.W #$0F00,D2
LSR.W #8,D2
CMP.B D2,D0
BEQ.S setrsk2
AND.W #$00FF,D1
LSL.W #8,D0
OR.W D0,D1
MOVE.W D1,(A0)
BSR ShowColSliders
BSR ShowRainbow
BSR SetupVUCols
setrsk2 BTST #6,$BFE001
BEQ.S set2r2
RTS
SetGreen2
CMP.W #79,D0
BHS SelectColor2
set2g2 BSR GetColPos
AND.W #$00F0,D2
LSR.W #4,D2
CMP.B D2,D0
BEQ.S setgsk2
AND.W #$0F0F,D1
LSL.W #4,D0
OR.W D0,D1
MOVE.W D1,(A0)
BSR ShowColSliders
BSR ShowRainbow
BSR SetupVUCols
setgsk2 BTST #6,$BFE001
BEQ.S set2g2
RTS
SetBlue2
CMP.W #79,D0
BHS.S SelectColor2
set2b2 BSR GetColPos
AND.W #$000F,D2
CMP.B D2,D0
BEQ.S setbsk2
AND.W #$0FF0,D1
OR.W D0,D1
MOVE.W D1,(A0)
BSR ShowColSliders
BSR ShowRainbow
BSR SetupVUCols
setbsk2 BTST #6,$BFE001
BEQ.S set2b2
RTS
SelectColor2
MOVEQ #0,D7
setcolp BTST #6,$BFE001
BNE.S ChkSpread
MOVE.W ColorsMax(PC),D0
MOVE.W MouseY,D1
CMP.W D7,D1
BEQ.S setcolp
MOVE.W D1,D7
CMP.W #37,D1
BHS.S setcoly
MOVEQ #37,D1
setcoly SUB.W #37,D1
CMP.W D0,D1
BLT.S setcol2
MOVE.W D0,D1
SUBQ.W #1,D1
setcol2 MOVE.W D1,RainbowPos
BSR ShowRainbow
BSR GetColPos
MOVE.L A0,UndoColAddr
MOVE.W D1,UndoCol
BSR ShowColSliders
BRA setcolp
ChkSpread
TST.W SpreadFlag
BEQ Return1
CLR.W SpreadFlag
BSR GetColPos
MOVE.W SpreadFrom,D0
MOVE.W RainbowPos,D1
CMP.W D1,D0
BLO.S chkspr2
EXG D0,D1
chkspr2 MOVE.W D1,D4
SUB.W D0,D4
CMP.W #1,D4
BLS Return1
MOVE.L D4,A2
ADD.W D4,D4
MOVE.L TheRightColors(PC),A0
MOVE.L A0,A1
ADD.W D0,D0
ADD.W D1,D1
LEA (A0,D0.W),A0 ; 1st col
MOVE.W (A0),D2
LEA (A1,D1.W),A1
MOVE.W (A1),D3 ; 2nd col
MOVEQ #0,D5
sprdlop MOVE.W D2,D0 ; red
LSR.W #8,D0
MOVE.W D3,D1
LSR.W #8,D1
BSR ColCrossfade
LSL.W #8,D0
MOVE.W D0,D7
MOVE.W D2,D0 ; green
LSR.W #4,D0
AND.W #$000F,D0
MOVE.W D3,D1
LSR.W #4,D1
AND.W #$000F,D1
BSR ColCrossfade
LSL.W #4,D0
OR.W D0,D7
MOVE.W D2,D0 ; blue
AND.W #$000F,D0
MOVE.W D3,D1
AND.W #$000F,D1
BSR ColCrossfade
OR.W D0,D7
ADDQ.W #2,D5
MOVE.W D7,(A0)+
CMP.L A1,A0
BLO sprdlop
BRA rocoup2
ColCrossfade
MOVE.W D4,D6
SUB.W D5,D6
MULU D6,D0
ADD.L A2,D0
MULU D5,D1
ADD.W D1,D0
DIVU D4,D0
CMP.W #15,D0
BLS Return1
MOVEQ #15,D0
RTS
ShowRainbow
MOVE.L TextBplPtr,A0
LEA 1490(A0),A0
MOVEQ #0,D1
MOVE.L #$00FFE000,D2
MOVE.W RainbowPos,D3
rainlop MOVE.L D2,D0
CMP.W D3,D1
BNE.S rainsk1
MOVE.L #$1EFFEF00,D0
rainsk1 MOVE.L D0,(A0)
LEA 40(A0),A0
ADDQ.W #1,D1
CMP.W #48,D1
BLO.S rainlop
LEA CopListAnalyzer,A0
MOVE.L TheRightColors(PC),A1
MOVE.W #$5107,D0
MOVEQ #47,D1
MOVEQ #0,D2
rainlp2 MOVE.W D0,(A0)+
MOVE.W #$FFFE,(A0)+
MOVE.W #$018E,(A0)+
CMP.W ColorsMax(PC),D2
BLO.S rainsk2
CLR.W (A0)+
BRA.S rainsk3
rainsk2 MOVE.W (A1)+,(A0)+
rainsk3 ADD.W #$0100,D0
ADDQ.W #1,D2
DBRA D1,rainlp2
MOVEQ #63,D0
rainlp3 MOVE.L #$01B80000,(A0)+
DBRA D0,rainlp3
RTS
RainbowPos dc.w 0
TheRightColors dc.l 0
ColorsMax dc.w 48
;---- PT Decompacter ----
Decompact
MOVE.L A0,CompPtr
MOVE.L D0,CompLen
BSR.S FreeDecompMem
MOVE.L CompPtr(PC),A0
MOVE.L (A0),D0
MOVE.L D0,DecompMemSize
MOVEQ #0,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,DecompMemPtr
BEQ OutOfMemErr
MOVE.L D0,A1
MOVE.L CompPtr(PC),A0
MOVE.L CompLen(PC),D0
ADDQ.L #4,A0
SUBQ.L #4,D0
dcmloop MOVE.B (A0)+,D1
CMP.B #181,D1
BEQ.S DecodeIt
MOVE.B D1,(A1)+
decom2 SUBQ.L #1,D0
CMP.L #0,D0
BGT.S dcmloop
MOVE.L DecompMemPtr,A1
MOVEQ #-1,D0
RTS
DecodeIt
MOVEQ #0,D1
MOVE.B (A0)+,D1
MOVE.B (A0)+,D2
dcdloop MOVE.B D2,(A1)+
DBRA D1,dcdloop
SUBQ.L #2,D0
BRA.S decom2
FreeDecompMem
MOVE.L DecompMemPtr,D0
BEQ Return1
MOVE.L D0,A1
MOVE.L DecompMemSize,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
CLR.L DecompMemPtr
RTS
CompPtr dc.l 0
CompLen dc.l 0
;---- Position Insert/Delete Gadgets ----
PosInsDelGadgs
MOVE.W MouseY2,D0
CMP.W #11,D0
BHS Return1
MOVE.W MouseX2,D0
CMP.W #62,D0
BHS Return1
CMP.W #51,D0
BHS.S PosDelete
CMP.W #40,D0
BHS.S PosInsert
RTS
PosInsert
MOVE.L SongDataPtr,A0
LEA sd_pattpos(A0),A0
ADD.L #126,A0
MOVEQ #127,D0
MOVE.L CurrPos,D1
AND.L #127,D1
posinloop
MOVE.B (A0),1(A0)
SUBQ.L #1,A0
SUBQ.L #1,D0
CMP.L D1,D0
BHI.S posinloop
MOVE.B PatternNumber+3,1(A0)
BSR PositionUp
CLR.W UpOrDown
BSR SongLengthGadg
BRA WaitForButtonUp
PosDelete
MOVE.L SongDataPtr,A0
LEA sd_pattpos(A0),A0
MOVE.L CurrPos,D0
AND.L #127,D0
ADD.L D0,A0
posdeloop
MOVE.B 1(A0),(A0)
ADDQ.L #1,A0
ADDQ.L #1,D0
CMP.L #127,D0
BLS.S posdeloop
CLR.B -1(A0)
BSR ShowPosition
MOVE.W #-1,UpOrDown
BSR SongLengthGadg
BRA WaitForButtonUp
;---- Enter number gadg ----
EnterNumGadg
MOVE.W MouseY2,D1
CMP.W #11,D1
BLO EnterPosGadg
CMP.W #22,D1
BLO EnterPattGadg
CMP.W #33,D1
BLO EnterLenGadg
RTS
EnterPosGadg
CLR.B RawKeyCode
MOVE.W #76,LineCurX
MOVE.W #10,LineCurY
MOVE.W #169,TextOffset
BSR GetDec3Dig
TST.W AbortDecFlag
BNE pogskip
CMP.W #127,D0
BLS.S eposgok
MOVEQ #127,D0
eposgok MOVE.L D0,CurrPos
BRA pogskip
EnterPattGadg
CLR.B RawKeyCode
MOVE.W #84,LineCurX
MOVE.W #21,LineCurY
MOVE.W #610,TextOffset
BSR GetDecByte
TST.W AbortDecFlag
BNE pogskip
CMP.B #63,D0
BLS.S epgok
MOVEQ #63,D0
epgok MOVE.L SongDataPtr,A0
LEA sd_pattpos(A0),A0
ADD.L CurrPos,A0
MOVE.B D0,(A0)
BRA pogskip
EnterLenGadg
CLR.B RawKeyCode
MOVE.W #76,LineCurX
MOVE.W #32,LineCurY
MOVE.W #1049,TextOffset
BSR GetDec3Dig
TST.W AbortDecFlag
BNE ShowSongLength
CMP.W #128,D0
BLS.S elengok
MOVE.B #128,D0
elengok MOVE.L SongDataPtr,A0
LEA sd_numofpatt(A0),A0
MOVE.B D0,(A0)
BRA ShowSongLength
GetDec3Dig
MOVE.W #1,AbortDecFlag
BSR StorePtrCol
BSR SetWaitPtrCol
BSR UpdateLineCurPos
gd3loop BSR GetKey0_9
CMP.W #68,D1
BEQ.S gd3exit
CMP.W #2,D1
BHI.S gd3loop
MOVE.W D1,D0
MULU #100,D0
MOVE.W D0,gd3temp
BSR ShowOneDigit
ADDQ.W #8,LineCurX
BSR UpdateLineCurPos
BSR GetKey0_9
CMP.B #68,D1
BEQ.S gd3exit
MOVE.W D1,D0
MULU #10,D0
ADD.W D0,gd3temp
BSR ShowOneDigit
ADDQ.W #8,LineCurX
BSR UpdateLineCurPos
BSR GetKey0_9
CMP.B #68,D1
BEQ.S gd3exit
ADD.W D1,gd3temp
CLR.W AbortDecFlag
gd3exit CLR.W LineCurX
MOVE.W #270,LineCurY
BSR UpdateLineCurPos
BSR RestorePtrCol
MOVEQ #0,D0
MOVE.W gd3temp(PC),D0
RTS
gd3temp dc.w 0
;---- Up/Down Gadgets ----
DownGadgets
MOVE.W #1,UpdateFreeMem
MOVE.W #-1,UpOrDown
BRA.S ug2
UpGadgets
MOVE.W #1,UpdateFreeMem
CLR.W UpOrDown
ug2 MOVE.W MouseY2,D0
CMP.W #100,D0
BHS Return1
CMP.W #89,D0
BHS RepLenGadg
CMP.W #78,D0
BHS RepeatGadg
CMP.W #67,D0
BHS SampleLengthGadg
CMP.W #56,D0
BHS VolumeGadg
CMP.W #45,D0
BHS SampleNumGadg
CMP.W #34,D0
BHS FineTuneGadg
CMP.W #23,D0
BHS SongLengthGadg
CMP.W #12,D0
BHS PatternGadg
TST.W MouseY2
BHS.S PositionGadg
RTS
PositionGadg
TST.W UpOrDown
BMI.S PositionDown
PositionUp
ADDQ.L #1,CurrPos
BTST #2,$DFF016
BNE.S pogskp2
ADD.L #9,CurrPos
pogskp2 CMP.L #127,CurrPos
BLS.S pogskip
MOVE.L #127,CurrPos
pogskip MOVE.L CurrPos,SongPosition
BSR ShowPosition
BSR Wait_4000
BSR Wait_4000
BRA Wait_4000
PositionDown
SUBQ.L #1,CurrPos
BTST #2,$DFF016
BNE.S pogskp3
SUB.L #9,CurrPos
pogskp3 TST.L CurrPos
BPL.S pogskip
CLR.L CurrPos
BRA.S pogskip
PatternGadg
MOVE.L SongDataPtr,A0
LEA sd_pattpos(A0),A0
TST.W UpOrDown
BMI.S PatternDown
PatternUp
ADD.L CurrPos,A0
ADDQ.B #1,(A0)
BTST #2,$DFF016
BNE.S pagaskp
ADD.B #9,(A0)
pagaskp CMP.B #63,(A0)
BLS.S pogskip
MOVE.B #63,(A0)
BRA.S pogskip
PatternDown
ADD.L CurrPos,A0
SUBQ.B #1,(A0)
BTST #2,$DFF016
BNE.S padoskp
SUB.B #9,(A0)
padoskp TST.B (A0)
BPL pogskip
CLR.B (A0)
BRA pogskip
SongLengthGadg
MOVE.L SongDataPtr,A0
LEA sd_numofpatt(A0),A0
TST.W UpOrDown
BMI.S SongLengthDown
SongLengthUp
ADDQ.B #1,(A0)
BTST #2,$DFF016
BNE.S slupskp
ADD.B #9,(A0)
slupskp CMP.B #127,(A0)
BMI.S solgskip
MOVE.B #127,(A0)
solgskip
BSR ShowSongLength
BSR Wait_4000
BSR Wait_4000
BRA Wait_4000
SongLengthDown
SUBQ.B #1,(A0)
BTST #2,$DFF016
BNE.S sldoskp
SUB.B #9,(A0)
sldoskp CMP.B #1,(A0)
BGE.S solgskip
MOVE.B #1,(A0)
BRA.S solgskip
SampleNumGadg
BTST #2,$DFF016 ; Check Right Mousebutton
BNE.S SampleNum2
TST.W InsNum
BEQ ShowSampleInfo
MOVE.W InsNum,LastInsNum
CLR.W InsNum
BRA ShowSampleInfo
SampleNum2
TST.W UpOrDown
BMI.S SampleNumDown
SampleNumUp
ADDQ.W #1,InsNum
CMP.W #31,InsNum
BMI.S snuskip
MOVE.W #31,InsNum
snuskip BSR redrsam
BSR Wait_4000
BRA Wait_4000
SampleNumDown
TST.W InsNum
BEQ.S snuskip
SUBQ.W #1,InsNum
CMP.W #1,InsNum
BPL.S snuskip
MOVE.W #1,InsNum
BRA.S snuskip
FineTuneGadg
MOVE.L SongDataPtr,A0
LEA 12(A0),A0
MOVE.W InsNum,D0
BEQ Return1
MULU #30,D0
ADD.L D0,A0
BTST #2,$DFF016
BNE.S ftgskip
CLR.B 2(A0)
BRA.S ftuskip
ftgskip TST.W UpOrDown
BMI.S FineTuneDown
FineTuneUp
AND.B #$0F,2(A0)
CMP.B #7,2(A0)
BEQ.S ftuskip
ADDQ.B #1,2(A0)
AND.B #$0F,2(A0)
ftuskip BSR ShowSampleInfo
BSR Wait_4000
BRA Wait_4000
FineTuneDown
AND.B #$0F,2(A0)
CMP.B #8,2(A0)
BEQ.S ftuskip
SUBQ.B #1,2(A0)
AND.B #$0F,2(A0)
BRA.S ftuskip
VolumeGadg
MOVE.L SongDataPtr,A0
LEA 12(A0),A0
MOVE.W InsNum,D0
BEQ Return1
MULU #30,D0
ADD.L D0,A0
TST.W UpOrDown
BMI.S VolumeDown
VolumeUp
ADDQ.B #1,3(A0)
BTST #2,$DFF016
BNE.S voupskp
ADD.B #15,3(A0)
voupskp CMP.B #$40,3(A0)
BLS.S ftuskip
MOVE.B #$40,3(A0)
BRA.S ftuskip
VolumeDown
SUBQ.B #1,3(A0)
BTST #2,$DFF016
BNE.S vodoskp
SUB.B #15,3(A0)
vodoskp TST.B 3(A0)
BPL ftuskip
CLR.B 3(A0)
BRA ftuskip
SampleLengthGadg
MOVE.W #1,SampleLengthFlag
MOVE.L SongDataPtr,A0
LEA 12(A0),A0
MOVEQ #0,D0
MOVE.W InsNum,D0
BEQ ShowSampleInfo
MULU #30,D0
ADD.L D0,A0
TST.W UpOrDown
BMI.S SampleLengthDown
SampleLengthUp
ADDQ.W #1,(A0)
BTST #2,$DFF016
BNE.S sluskip
CMP.W #$7FF0,(A0)
BHS.S sluskip
ADDQ.W #7,(A0)
sluskip CMP.W #$7FFF,(A0)
BLO ShowSampleInfo
MOVE.W #$7FFF,(A0)
BRA ShowSampleInfo
SampleLengthDown
MOVE.W 4(A0),D0
ADD.W 6(A0),D0
SUBQ.W #1,(A0)
BTST #2,$DFF016
BNE.S sldskip
SUBQ.W #7,(A0)
sldskip BMI.S sldskip2
CMP.W (A0),D0
BLS ShowSampleInfo
MOVE.W D0,(A0)
BRA ShowSampleInfo
sldskip2
CLR.W (A0)
BRA ShowSampleInfo
SampleLengthFlag dc.w 0
CheckSampleLength
TST.W SampleLengthFlag
BEQ Return1
CLR.W SampleLengthFlag
MOVEQ #0,D0
MOVE.W InsNum,D0
BEQ Return1
MOVE.L SongDataPtr,A0
LEA 12(A0),A0
MOVE.L D0,D1
LSL.W #2,D1
MULU #30,D0
ADD.L D0,A0
LEA SamplePtrs,A1
LEA (A1,D1.W),A1
MOVE.L A0,PlaySamPtr
MOVE.L A1,RealSamPtr
MOVE.L 124(A1),D0
LSR.L #1,D0
MOVE.W (A0),D1
CMP.W D0,D1
BHI.S ItsTooMuch
RTS
ItsTooMuch
LEA AddWorkSpaceText(PC),A0
BSR AreYouSure
BNE.S RestoreLength
BSR TurnOffVoices
MOVE.L PlaySamPtr,A0
MOVEQ #0,D0
MOVE.W (A0),D0
LSL.L #1,D0
MOVE.L D0,SamAllocLen
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,SamAllocPtr
BEQ.S RestoreLength
MOVE.L D0,A1
MOVE.L RealSamPtr,A0
MOVE.L (A0),D0
BEQ.S nosamth
MOVE.L D0,A2
MOVE.L 124(A0),D1
BEQ.S nosamth
SUBQ.L #1,D1
cpsalop MOVE.B (A2)+,(A1)+
DBRA D1,cpsalop
MOVE.L (A0),A1
MOVE.L 124(A0),D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
nosamth MOVE.L RealSamPtr,A0
MOVE.L SamAllocPtr,(A0)
MOVE.L SamAllocLen,124(A0)
BSR ShowSampleInfo
BSR RedrawSample
BRA WaitForButtonUp
RestoreLength
MOVE.L PlaySamPtr,A0
MOVE.L RealSamPtr,A1
MOVE.L 124(A1),D0
LSR.L #1,D0
MOVE.W D0,(A0)
BRA ShowSampleInfo
AddWorkSpaceText dc.b 'add workspace ?',0
PlaySamPtr dc.l 0
RealSamPtr dc.l 0
SamAllocPtr dc.l 0
SamAllocLen dc.l 0
RepeatGadg
MOVE.L SongDataPtr,A0
LEA 12(A0),A0
MOVEQ #0,D0
MOVE.W InsNum,D0
BEQ ShowSampleInfo
MULU #30,D0
ADD.L D0,A0
TST.W UpOrDown
BMI.S RepeatDown
RepeatUp
ADDQ.W #1,4(A0)
BTST #2,$DFF016
BNE.S ruskip
ADDQ.W #7,4(A0)
ruskip MOVE.W (A0),D0 ; Length
BEQ.S ruskip2
SUB.W 6(A0),D0 ; - RepLen
CMP.W 4(A0),D0
BHI.S ruskip2
MOVE.W D0,4(A0)
ruskip2 BSR ShowSampleInfo
BSR UpdateRepeats
BRA SetLoopSprites2
RepeatDown
SUBQ.W #1,4(A0)
BTST #2,$DFF016
BNE.S rdskip
SUBQ.W #7,4(A0)
rdskip TST.W 4(A0)
BPL.S ruskip2
CLR.W 4(A0)
BRA.S ruskip2
RepLenGadg
MOVE.L SongDataPtr,A0
LEA 12(A0),A0
MOVEQ #0,D0
MOVE.W InsNum,D0
BEQ ShowSampleInfo
MULU #30,D0
ADD.L D0,A0
TST.W UpOrDown
BMI.S RepLenDown
RepLenUp
ADDQ.W #1,6(A0)
BTST #2,$DFF016 ; Check Right Mousebutton
BNE.S rluskip
ADDQ.W #7,6(A0)
rluskip MOVE.W (A0),D0
BEQ.S ruskip2
SUB.W 4(A0),D0
CMP.W 6(A0),D0
BHI.S ruskip2
BRA.S rldskip
RepLenDown
MOVEQ #0,D0
MOVE.W 6(A0),D0
SUBQ.L #1,D0
BTST #2,$DFF016
BNE.S rldskip
SUBQ.L #7,D0
rldskip CMP.L #1,D0
BGE.S rldskp2
MOVEQ #1,D0
rldskp2 MOVE.W D0,6(A0)
BRA ruskip2
Wait_4000
MOVE.W #$4000,D0
TST.B HHFlag
BEQ.S wl_loop
MOVE.W #$FFFF,D0
wl_lop1 DBRA D0,wl_lop1
MOVE.W #$A000,D0
wl_loop DBRA D0,wl_loop
RTS
UpdateRepeats
LEA audchan1temp,A1
LEA $DFF0A0,A2
LEA ScopeInfo,A3
BSR.S upre2
LEA audchan2temp,A1
LEA $DFF0B0,A2
LEA ScopeInfo+20,A3
BSR.S upre2
LEA audchan3temp,A1
LEA $DFF0C0,A2
LEA ScopeInfo+40,A3
BSR.S upre2
LEA audchan4temp,A1
LEA $DFF0D0,A2
LEA ScopeInfo+60,A3
upre2 MOVE.W InsNum,D0
CMP.B n_samplenum(A1),D0
BNE Return1
MOVE.L n_start(A1),A1
MOVEQ #0,D0
MOVE.W 4(A0),D0 ; repeat
ADD.L D0,A1
ADD.L D0,A1
MOVE.L A1,(A2)
MOVE.W 6(A0),D0
MOVE.W D0,4(A2) ; replen
MOVE.L A1,ns_repeatptr(A3)
ADD.L D0,A1
ADD.L D0,A1
MOVE.L A1,ns_rependptr(A3)
RTS
SetPatternPos
MOVE.L PatternPosition,D0
LSR.L #4,D0
BRA.S ssppskip
SetScrPatternPos
MOVE.W ScrPattPos,D0
ssppskip
TST.W SamScrEnable
BNE Return1
MOVE.W D0,PlayFromPos
MULU #7*40,D0
MOVE.L TextBplPtr,A0
LEA $15B8(A0),A0
ADD.L A0,D0
MOVE.L CopListBpl4Ptr(PC),A1
MOVE.W D0,6(A1)
SWAP D0
MOVE.W D0,2(A1)
RTS
PlayFromPos dc.w 0
WantedPattGadg
TST.W SamScrEnable
BNE CheckSamGadgets
TypeInWantedPatt
CMP.W #138,D1
BHI.S tiwp2
CMP.W #25,D0
BHI TempoGadg
tiwp2 CMP.L #'patp',RunMode ; not if a song is playing...
BEQ Return1
CLR.B RawKeyCode
MOVE.W #12,LineCurX
MOVE.W #$0086,LineCurY
MOVE.W #5121,TextOffset
BSR GetDecByte
TST.W AbortDecFlag
BNE.S twexit
MOVE.B D0,PatternNumber+3
CMP.L #63,PatternNumber
BLS.S twexit
MOVE.L #63,PatternNumber
twexit BRA RedrawPattern
GetKey0_9
BTST #2,$DFF016
BEQ.S gk_ret
MOVEQ #0,D0
BSR DoKeyBuffer
MOVE.B RawKeyCode,D0
BEQ.S GetKey0_9
CLR.B RawKeyCode
CMP.B #68,D0
BEQ.S gk_ret
CMP.B #69,D0
BEQ.S gk_ret
CMP.B #10,D0
BEQ.S gk_end
BHI.S GetKey0_9
CMP.B #1,D0
BLO.S GetKey0_9
MOVE.L D0,D1
RTS
gk_end MOVEQ #0,D1
RTS
gk_ret MOVEQ #68,D1
RTS
ShowOneDigit
ADD.B #'0',D1
MOVE.B D1,NumberText
CLR.W D1
SWAP D1
MOVE.W #1,TextLength
MOVE.L #NumberText,ShowTextPtr
BSR ShowText
CLR.L NumberText
CLR.W WordNumber
RTS
;---- Get Text Line ----
GetTextLine
MOVEQ #0,D0
MOVE.W A4,D0
DIVU #40,D0
ADDQ.W #5,D0
MOVE.W D0,LineCurY
SWAP D0
LSL.W #3,D0
ADDQ.W #4,D0
MOVE.W D0,LineCurX
BSR UpdateLineCurPos
MOVE.L ShowTextPtr,DSTPtr
CLR.L DSTOffset
CLR.L DSTPos
MOVE.W #1,GetLineFlag
MOVE.L A4,A5
MOVE.W LineCurX,D5
CLR.B RawKeyCode
BSR UpdateText
WaitForKey
BTST #2,$DFF016
BEQ AbortGetLine
BTST #6,$BFE001
BEQ LineClicked
BSR DoKeyBuffer
MOVEQ #0,D1
MOVE.B RawKeyCode,D1
BEQ.S WaitForKey
CMP.B #78,D1
BEQ MoveCharRight
CMP.B #79,D1
BEQ MoveCharLeft
CMP.B #70,D1
BEQ DeleteChar
CMP.B #65,D1
BEQ BackspaceChar
CMP.B #68,D1
BEQ GetLineReturn
CMP.B #69,D1
BEQ GetLineReturn
BTST #7,D1
BNE.S WaitForKey
LEA UnshiftedKeymap,A4
TST.W ShiftKeyStatus
BEQ.S gtlskip
LEA ShiftedKeymap,A4
gtlskip AND.W #$007F,D1
CMP.B #64,D1
BHI.S WaitForKey
MOVE.B (A4,D1.W),D1
BEQ.S WaitForKey
TST.B EnterTextFlag
BEQ.S TextLineKey
CMP.B #'0',D1
BLO WaitForKey
CMP.B #'f',D1
BHI WaitForKey
CMP.B #'a',D1
BHS.S TextLineKey
CMP.B #'9',D1
BHI WaitForKey
TextLineKey
CMP.L TextEndPtr,A6
BEQ WaitForKey
MOVE.L TextEndPtr,A4
tlkloop MOVE.B -(A4),1(A4)
CMP.L A4,A6
BNE.S tlkloop
MOVE.L TextEndPtr,A4
CLR.B (A4)
MOVE.B D1,(A6)+
BSR PosMoveRight
BSR UpdateText
CLR.B RawKeyCode
BRA WaitForKey
LineClicked
MOVE.W MouseY,D1
SUB.W LineCurY,D1
CMP.W #2,D1
BGT GetLineReturn
CMP.W #-8,D1
BLT GetLineReturn
MOVE.W MouseX,D1
SUB.W LineCurX,D1
ADDQ.W #4,D1
ASR.W #3,D1
BEQ WaitForKey
BPL.S linclri
CMP.L DSTPtr(PC),A6
BEQ WaitForKey
SUBQ.L #1,A6
BSR PosMoveLeft
upwake2 BSR UpdateText
BRA WaitForKey
linclri CMP.L TextEndPtr,A6
BEQ WaitForKey
TST.B (A6)
BEQ WaitForKey
ADDQ.L #1,A6
BSR PosMoveRight
BRA.S upwake2
PosMoveRight
MOVE.L DSTPos,D0
MOVEQ #0,D1
MOVE.W TextLength,D1
TST.B EnterTextFlag
BNE.S pmrskip
SUBQ.W #1,D1
pmrskip CMP.L D1,D0
BLO.S posrok
ADDQ.L #1,DSTOffset
BRA UpdateLineCurPos
posrok ADDQ.L #1,DSTPos
ADDQ.W #8,LineCurX
BRA UpdateLineCurPos
PosMoveLeft
TST.L DSTPos
BNE.S poslok
SUBQ.L #1,DSTOffset
BRA UpdateLineCurPos
poslok SUBQ.L #1,DSTPos
SUBQ.W #8,LineCurX
BRA UpdateLineCurPos
BackspaceChar
CMP.L DSTPtr(PC),A6
BEQ WaitForKey
SUBQ.L #1,A6
MOVE.L A6,A4
dobaloop
MOVE.B 1(A4),(A4)+
CMP.L TextEndPtr,A4
BNE.S dobaloop
BSR PosMoveLeft
upwake BSR UpdateText
BSR Wait_4000
BSR Wait_4000
BSR Wait_4000
BRA WaitForKey
DeleteChar
MOVE.L A6,A4
dechloop
MOVE.B 1(A4),(A4)+
CMP.L TextEndPtr,A4
BLO.S dechloop
BRA.S upwake
MoveCharRight
CMP.L TextEndPtr,A6
BEQ WaitForKey
TST.B (A6)
BEQ WaitForKey
ADDQ.L #1,A6
BSR PosMoveRight
BRA.S upwake
MoveCharLeft
CMP.L DSTPtr(PC),A6
BEQ WaitForKey
SUBQ.L #1,A6
BSR PosMoveLeft
BRA.S upwake
GetLineReturn
MOVE.L DSTPtr,A6
CMP.B #1,EnterTextFlag
BNE.S gtl_rskip
TST.B DiskNumText2
BEQ WaitForKey
gtl_rskip
CMP.B #3,EnterTextFlag
BNE.S gtl_rskip2
TST.B SndDiskNum1
BEQ WaitForKey
gtl_rskip2
MOVE.L A6,A4
dlrloop TST.B (A4)+
BNE.S dlrloop
SUBQ.L #1,A4
dlrloop2
CMP.L TextEndPtr,A4
BHS.S dlrexit
CLR.B (A4)+
BRA.S dlrloop2
dlrexit CLR.W LineCurX
MOVE.W #270,LineCurY
BSR UpdateLineCurPos
CLR.W GetLineFlag
MOVE.B RawKeyCode,MixChar
CLR.B RawKeyCode
CLR.L DSTOffset
BSR.S UpdateText
BRA WaitForButtonUp
AbortGetLine
MOVE.L DSTPtr,A6
MOVE.L A6,A4
clliloop
CLR.B (A4)+
CMP.L TextEndPtr,A4
BNE.S clliloop
BSR.S UpdateText
BRA GetLineReturn
UpdateText
MOVE.W A5,TextOffset
MOVE.L DSTPtr,A0
ADD.L DSTOffset,A0
BRA ShowText2
DSTPtr dc.l 0
DSTPos dc.l 0
DSTOffset dc.l 0
;----
TypeInSongName
BSR StorePtrCol
BSR SetWaitPtrCol
CLR.L EditMode
MOVE.L SongDataPtr,A6
MOVE.L A6,TextEndPtr
MOVE.L A6,ShowTextPtr
ADD.L #19,TextEndPtr
MOVE.W #20,TextLength
MOVE.W #4133,A4
BSR GetTextLine
CLR.L TextEndPtr
BRA RestorePtrCol
CheckSmplNamOrLoad
CMP.W #287,MouseX2
BHS LoadNamedSample
TypeInSampleName
BSR StorePtrCol
BSR SetWaitPtrCol
CLR.L EditMode
MOVE.L SongDataPtr,A6
LEA -10(A6),A6
MOVE.W InsNum,D7
BNE.S tisnskip
MOVE.W LastInsNum,D7
tisnskip
MULU #30,D7
ADD.L D7,A6
MOVE.L A6,TextEndPtr
MOVE.L A6,ShowTextPtr
ADD.L #21,TextEndPtr
MOVE.W #22,TextLength
MOVE.W #4573,A4
BSR GetTextLine
CLR.L TextEndPtr
BRA RestorePtrCol
LoadSample
TST.W InsNum
BEQ NotSampleNull
BSR StorePtrCol
LEA SamplePath2,A0
BSR CopyPath
LEA DirInputName,A0
MOVEQ #DirNameLength-1,D0
lsloop MOVE.B (A0)+,(A1)+
DBRA D0,lsloop
MOVE.L SongDataPtr,A0
MOVE.W InsNum,D0
MULU #30,D0
LEA -10(A0),A0
ADD.L D0,A0
LEA DirInputName,A1
MOVEQ #21,D0
lsloop2 MOVE.B (A1)+,(A0)+
DBRA D0,lsloop2
BSR SetDiskPtrCol
MOVE.L #FileName,D1
BSR ExamineAndAlloc
BEQ ErrorRestoreCol
MOVE.L #FileName,D1
BRA lnssec2
CheckForIFF2 ; load loop
MOVEQ #-1,D2
BRA.S ciff2
CheckForIFF
MOVEQ #0,D2
ciff2 MOVEQ #0,D1
CMP.L #'FORM',(A0)
BNE.S wiskip
CMP.L #'8SVX',8(A0)
BNE.S wiskip
MOVE.L A0,A2
MOVE.L A1,D0
ADD.L A0,A1
TST.L D2
BEQ.S cfiloop
BSR.S CheckIFFLoop
cfiloop CMP.L #'BODY',(A0)
BEQ.S wasiff
ADDQ.L #2,A0
CMP.L A1,A0
BLS.S cfiloop
RTS
WasIFF ADDQ.L #8,A0
ADD.L A2,D0
SUB.L A0,D0
wiloop MOVE.B (A0)+,(A2)+
CMP.L A1,A0
BLS.S wiloop
MOVE.L SampleInstrSave(PC),A3
LSR.W #1,D0
MOVE.W 22(A3),D1
SUB.W D0,D1
MOVE.W D0,22(A3)
wiskip LEA SampleLengthAdd(PC),A3
MOVE.W InsNum,D0
LSL.W #1,D0
MOVE.W D1,(A3,D0.W)
RTS
CheckIFFLoop
TST.B IFFLoopFlag
BEQ Return2
MOVEM.L A0/D0,-(SP)
cilloop CMP.L #'VHDR',(A0)
BEQ.S wasvhdr
ADDQ.L #2,A0
CMP.L A1,A0
BLS.S cilloop
cilend MOVEM.L (SP)+,A0/D0
RTS
wasvhdr MOVE.L SampleInstrSave(PC),A3
MOVE.L 12(A0),D0
BEQ.S cilend
LSR.W #1,D0
MOVE.W D0,28(A3)
MOVE.L 8(A0),D0
BNE.S wsvhdr2
MOVEQ #2,D0
wsvhdr2 LSR.W #1,D0
MOVE.W D0,26(A3)
BRA.S cilend
SampleInstrSave dc.l 0
SampleLengthAdd dcb.w 32,0
ExamineAndAlloc
MOVEQ #-2,D2
MOVE.L DOSBase,A6
JSR LVOLock(A6)
MOVE.L D0,FileLock
BEQ CantFindFile
MOVE.L D0,D1
MOVE.L #FileInfoBlock,D2
JSR LVOExamine(A6)
TST.L FIB_EntryType
BPL CantExamFile
MOVE.L FileLock,D1
JSR LVOUnLock(A6)
MOVE.L FIB_FileSize,D0
BEQ FileIsEmpty
BSR TurnOffVoices
BSR FreeSample
MOVE.L FIB_FileSize,D0
CMP.L #$FFFE,D0
BLS.S exalloc
MOVE.L #$FFFE,D0
exalloc LEA SamplePtrs,A4
MOVE.W InsNum,D1
LSL.W #2,D1
ADD.W D1,A4
MOVE.L D0,124(A4)
MOVE.L D0,DiskDataLength
MOVE.L 4.W,A6
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
JSR LVOAllocMem(A6)
MOVE.L D0,DiskDataPtr
MOVE.L D0,(A4)
BEQ OutOfMemErr
LEA LoadingSampleText(PC),A0
BSR ShowStatusText
MOVE.L SongDataPtr,A0
MOVE.W InsNum,D0
MULU #30,D0
LEA -10(A0),A0
ADD.L D0,A0
MOVE.L A0,SampleInstrSave
MOVE.L DiskDataLength,D0
LSR.L #1,D0
MOVE.W D0,22(A0)
MOVE.L #$00400000,24(A0)
MOVE.W #1,28(A0)
BSR ShowSampleInfo
MOVEQ #-1,D0
RTS
LoadNamedSample
TST.W InsNum
BEQ NotSampleNull
BSR StorePtrCol
BSR CreateSampleName
BSR SetDiskPtrCol
MOVE.L FileNamePtr,D1
BSR ExamineAndAlloc
BEQ Return2
MOVE.L FileNamePtr,D1
lnssec2 MOVE.L DOSbase(PC),A6
MOVE.L #1005,D2
JSR LVOOpen(A6)
MOVE.L D0,D7
BEQ CantOpenFile
MOVE.L D0,D1
MOVE.L DiskDataPtr,D2
MOVE.L DiskDataLength,D3
JSR LVORead(A6)
MOVE.L D7,D1
JSR LVOClose(A6)
MOVE.L DiskDataPtr,A0
MOVE.L DiskDataLength,A1
BSR CheckForIFF2
BSR ValidateLoops
BSR ShowSampleInfo
MOVE.L DiskDataPtr,A0
CLR.W (A0)
BSR RedrawSample
CLR.L SavSamInf
BSR ShowAllRight
BRA RestorePtrCol
CreateSampleName
LEA SampleFileName,A0
MOVEQ #27,D0
csnloop CLR.B (A0)+
DBRA D0,csnloop
MOVE.L SongDataPtr,A0
MOVE.W InsNum,D0
MULU #30,D0
LEA -10(A0),A0
ADD.L D0,A0
MOVE.L A0,SampleInstrSave
MOVEQ #0,D0
MOVE.W 22(A0),D0
ADD.L D0,D0
MOVE.L D0,DiskDataLength
MOVE.L D0,IFFBODY+4
ADD.L #IFFEND-IFFFORM-8,D0
MOVE.L D0,IFFFORM+4
MOVEQ #0,D0
MOVE.W 22(A0),D0
ADD.L D0,D0
MOVEQ #0,D1
MOVE.W 28(A0),D1
CMP.W #1,D1
BLS.S csnskp2
ADD.L D1,D1
MOVEQ #0,D0
MOVE.W 26(A0),D0
ADD.L D0,D0
BRA.S csnskp3
csnskp2 MOVEQ #0,D1
csnskp3 MOVE.L D0,IFFVHDR+8
MOVE.L D1,IFFVHDR+12
LEA SampleFileName,A1
LEA IFFNAME+8,A2
MOVEQ #21,D0
csnloop2
MOVE.B (A0),(A1)+
MOVE.B (A0)+,(A2)+
DBRA D0,csnloop2
MOVE.L #SampleFileName,D1
MOVE.L D1,FileNamePtr
BSR.S FindColon
BEQ.S CheckOverride
LEA SamplePath2,A0
BSR CopyPath
MOVE.L #SampleFileName,A0
csnloop3
MOVE.B (A0)+,(A1)+
BNE.S csnloop3
MOVE.L #FileName,FileNamePtr
RTS
FindColon
MOVE.L D1,A0
fcloop MOVE.B (A0)+,D0
BEQ.S FindColonFail
CMP.B #':',D0
BEQ.S FindColonSuccess
BRA.S fcloop
FindColonFail
MOVEQ #-1,D0
RTS
FindColonSuccess
MOVEQ #0,D0
RTS
CheckOverride
TST.B OverrideFlag
BEQ Return2
MOVE.L #SampleFileName,A0
MOVE.L A0,A1
LEA 21(A1),A1
MOVE.L A1,A2
chkovlp MOVE.B -(A1),D0
CMP.B #':',D0
BEQ.S chkovok
CMP.B #'/',D0
BEQ.S chkovok
MOVE.L A1,A2
CMP.L A0,A1
BHI.S chkovlp
chkovok LEA SamplePath2,A0
BSR CopyPath
chkovl2 MOVE.B (A2)+,(A1)+
BNE.S chkovl2
MOVE.L #FileName,FileNamePtr
RTS
ValidateLoops
MOVE.L SongDataPtr,A0
LEA 20(A0),A0
MOVEQ #30,D0
valolop MOVE.W 22(A0),D1
MOVE.W 26(A0),D2
MOVE.W 28(A0),D3
CMP.W D1,D2
BHS.S valosk1
ADD.W D2,D3
CMP.W D1,D3
BHI.S valosk2
valoque TST.W 28(A0)
BNE.S valosk3
MOVE.W #1,28(A0)
valosk3 LEA 30(A0),A0
DBRA D0,valolop
RTS
valosk2 SUB.W D2,D1
MOVE.W D1,28(A0)
BRA.S valoque
valosk1 MOVEQ #1,D1
MOVE.L D1,26(A0)
BRA.S valoque
LoadPreset
CLR.B RawKeyCode
TST.W InsNum
BEQ NotSampleNull
BSR TurnOffVoices
BSR FreeSample
BSR CreateSampleName
MOVE.L FileNamePtr,A0
TST.B (A0)
BEQ Return2
MOVE.L DiskDataLength(PC),D0
BEQ Return2
MOVE.L DiskDataLength(PC),D0
BSR AllocSample
MOVE.L DiskDataPtr(PC),D0
BEQ.S loprerr
BSR ShowSampleInfo
BSR DoLoadData
BSR ShowAllRight
MOVE.L DiskDataPtr(PC),A0
MOVE.L DiskDataLength(PC),A1
BSR CheckForIFF
BSR ValidateLoops
BSR ShowSampleInfo
MOVE.L DiskDataPtr(PC),A0
CLR.W (A0)
BSR RedrawSample
MOVE.W #1,UpdateFreeMem
RTS
loprerr BSR StorePtrCol
BSR OutOfMemErr
BSR RestorePtrCol
BRA RedrawSample
AllocSample
MOVE.L D0,-(SP)
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,DiskDataPtr
LEA SamplePtrs(PC),A0
MOVE.W InsNum(PC),D1
LSL.W #2,D1
LEA (A0,D1.W),A0
MOVE.L DiskDataPtr(PC),(A0)
MOVE.L (SP)+,124(A0)
RTS
FreeSample
LEA SamplePtrs(PC),A0
MOVE.W InsNum(PC),D0
BEQ Return2
LSL.W #2,D0
LEA (A0,D0.W),A0
MOVE.L (A0),D1
BEQ Return2
CLR.L (A0)
MOVE.L 124(A0),D0
CLR.L 124(A0)
MOVE.L D1,A1
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
RTS
NotSampleNull
LEA NotSample0Text(PC),A0
BSR ShowStatusText
BRA SetErrorPtrCol
NotSample0Text dc.b 'not sample 0 !',0,0
;----
DeleteSong
LEA DeleteSongText,A0
BSR AreYouSure
BNE Return2
LEA DeletingSongText(PC),A0
BSR ShowStatusText
LEA SongsPath2,A0
BSR CopyPath
LEA DirInputName,A0
MOVEQ #DirNameLength-1,D0
dsloop MOVE.B (A0)+,(A1)+
DBRA D0,dsloop
MOVE.W #1,Action
Delete3 MOVE.L #FileName,FileNamePtr
MOVE.L DOSbase(PC),A6
MOVE.L FileNamePtr(PC),D1
MOVE.L D1,A0
JSR LVODeleteFile(A6)
BSR ClearFileNames
BSR ShowAllRight
BSR SetNormalPtrCol
BSR StorePtrCol
BRA DoAutoDir
DeleteModule
LEA DeleteModuleText,A0
BSR AreYouSure
BNE Return2
LEA DeletingModuleText(PC),A0
BSR ShowStatusText
LEA ModulesPath2,A0
BSR CopyPath
LEA DirInputName,A0
MOVEQ #DirNameLength-1,D0
dmdloop MOVE.B (A0)+,(A1)+
DBRA D0,dmdloop
MOVE.W #3,Action
BRA.S Delete3
DeleteSample
LEA DeleteSampleText,A0
BSR AreYouSure
BNE Return2
LEA DeletingSampleText(PC),A0
BSR ShowStatusText
LEA SamplePath2,A0
BSR CopyPath
LEA DirInputName,A0
MOVEQ #DirNameLength-1,D0
dsaloop MOVE.B (A0)+,(A1)+
DBRA D0,dsaloop
MOVE.W #5,Action
BRA Delete3
RenameFile
LEA RenamingFileText(PC),A0
BSR ShowStatusText
LEA DirInputName,A0
LEA NewInputName,A1
MOVEQ #23,D0
rnfloop MOVE.B (A0)+,(A1)+
BNE.S rnfskip
SUBQ.L #1,A0
rnfskip DBRA D0,rnfloop
BSR StorePtrCol
BSR SetWaitPtrCol
LEA NewInputName,A6
MOVE.L A6,ShowTextPtr
MOVE.L A6,TextEndPtr
ADD.L #23,TextEndPtr
MOVE.W #24,TextLength
MOVE.W FileNameScrollPos+2,D0
MULU #240,D0
MOVE.W #1888,A4
ADD.W D0,A4
BSR GetTextLine
TST.B NewInputName
BEQ.S rnfend
CMP.B #69,MixChar
BEQ.S rnfend
MOVE.L PathPtr,A0
BSR CopyPath
LEA NewInputName,A0
MOVEQ #23,D0
rnfloop2
MOVE.B (A0)+,(A1)+
DBRA D0,rnfloop2
LEA FileName,A0
LEA NewFileName,A1
rnfloop3
MOVE.B (A0)+,(A1)+
BNE.S rnfloop3
MOVE.L PathPtr,A0
BSR CopyPath
LEA DirInputName,A0
MOVEQ #DirNameLength-1,D0
rnfloop4
MOVE.B (A0)+,(A1)+
DBRA D0,rnfloop4
MOVE.L #FileName,D1
MOVE.L #NewFileName,D2
MOVE.L DOSbase(PC),A6
JSR LVORename(A6)
rnfend BSR ClearFileNames
CLR.W Action
BSR RestorePtrCol
BRA ShowAllRight
LoadSong
MOVE.W #1,LoadInProgress
BSR DoClearSong
BSR ClrSampleInfo
LEA SongsPath2,A0
BSR CopyPath
LEA DirInputName,A0
MOVEQ #DirNameLength-1,D0
losoloop2
MOVE.B (A0)+,(A1)+
DBRA D0,losoloop2
MOVE.L SongDataPtr(PC),DiskDataPtr
MOVE.L #FileName,FileNamePtr
MOVE.L #70716,DiskDataLength
LEA LoadingSongText(PC),A0
BSR ShowStatusText
BSR DoLoadData
BEQ lososkip3
MOVE.L SongDataPtr(PC),A0
CMP.L #'PACK',(A0)
BNE.S lososkip
MOVE.L 4(A0),CrunchedSongLength
MOVE.L 8(A0),RealSongLength
MOVE.L SongDataPtr(PC),D0
ADD.L #70716,D0
SUB.L RealSongLength(PC),D0
MOVE.L D0,EndOfSongPtr
LEA DecrunchingText(PC),A0
BSR ShowStatusText
BSR Decruncher
BSR ShowAllRight
lososkip
MOVE.L SongDataPtr(PC),A0
CMP.L #'M.K.',sd_mahokakt(A0) ; M.K. again...
BEQ.S lososkip2
BSR MahoneyAndKaktus ; Was 16 instr, so move up...
lososkip2
LEA LoadingSongText(PC),A0
BSR ShowStatusText
BSR CheckAbort
BEQ.S lososkip3
TST.B AutoExitFlag
BEQ.S NoSongAutoExit
BSR ExitFromDir
NoSongAutoExit
CLR.L PatternNumber
CLR.L CurrPos
BSR RedrawPattern
CLR.W ScrPattPos
BSR SetScrPatternPos
BSR SortDisks
LEA SampleSortList(PC),A0
MOVEQ #30,D0
losoloop3
TST.B NosamplesFlag
BNE.S lososkip3
BSR CheckAbort
BEQ.S lososkip3
MOVE.W InsNum(PC),TuneUp
BSR DoShowFreeMem
MOVE.L (A0)+,D1
MOVE.W D1,InsNum
MOVEM.L D0/D1/A0,-(SP)
BSR LoadPreset
BSR ShowSampleInfo
MOVEM.L (SP)+,D0/D1/A0
DBRA D0,losoloop3
lososkip3
MOVE.W #1,InsNum
MOVE.L #6,CurrSpeed
CLR.W LoadInProgress
BSR ShowAllRight
BSR SetNormalPtrCol
BSR DoShowFreeMem
BSR CheckInstrLengths
BSR ShowSampleInfo
BRA RedrawSample
SortDisks
MOVEM.L D0-D4/A0-A1,-(SP)
MOVE.L SongDataPtr(PC),A0
LEA 23(A0),A0
LEA SampleSortList(PC),A1
MOVEQ #1,D0
losoloop4
MOVE.B (A0)+,(A1)+ ; ST-(0)1
MOVE.B (A0),(A1)+ ; ST-0(1)
MOVE.W D0,(A1)+ ; insnum
LEA 29(A0),A0
ADDQ.L #1,D0
CMP.L #32,D0
BLO.S losoloop4
losoloop5
CLR.W MoreInstrFlag
LEA SampleSortList(PC),A0
MOVEQ #29,D2
losoloop6
MOVE.W (A0),D0
MOVE.W 4(A0),D1
CMP.W D0,D1 ; if next disk greater
BHS.S loso2_2
MOVE.W #1,MoreInstrFlag
MOVE.L (A0),D3 ; swap disks
MOVE.L 4(A0),D4
MOVE.L D4,(A0)
MOVE.L D3,4(A0)
loso2_2 ADDQ.L #4,A0
DBRA D2,losoloop6
TST.W MoreInstrFlag
BNE.S losoloop5
LEA SampleSortList(PC),A0
MOVEQ #30,D0
losoloop7
CLR.W (A0)
ADDQ.L #4,A0
DBRA D0,losoloop7
MOVEM.L (SP)+,D0-D4/A0-A1
RTS
MahoneyAndKaktus
LEA Loadas31text(PC),A0
BSR AreYouSure
BEQ.S putmk
MOVE.L SongDataPtr(PC),A0 ; M.K. 32 samples format!
LEA 466(A0),A1
ADD.L #66006,A0
makloop MOVE.L (A0),484(A0)
CLR.L (A0)
SUBQ.L #4,A0
CMP.L A0,A1
BNE.S makloop
MOVE.L SongDataPtr(PC),A0
LEA sd_mahokakt(A0),A1
LEA sd_numofpatt(A0),A0
makloop2
MOVE.W 4(A0),(A0)+
CMP.L A0,A1
BNE.S makloop2
MOVE.L #'M.K.',(A0) ; M.K. again!
MOVEQ #0,D0
RTS
putmk MOVE.L SongDataPtr(PC),A0
MOVE.L #'M.K.',sd_mahokakt(A0) ; put M.K.
MOVEQ #-1,D0
RTS
Loadas31Text dc.b "Load as 31 instr?",0
CheckInstrLengths
MOVE.L SongDataPtr(PC),A0
ADD.L #20,A0
MOVEQ #30,D1
xilloop MOVE.W 26(A0),D0
ADD.W 28(A0),D0
CMP.W 22(A0),D0
BLS.S xilSkip
MOVE.W 26(A0),D0
LSR.W #1,D0
MOVE.W D0,26(A0)
xilskip ADD.L #30,A0
DBRA D1,xilloop
RTS
CheckAbort
BTST #2,$DFF016
BNE Return2
MOVEM.L D0-D7/A0-A6,-(SP)
LEA AbortLoadText,A0
BSR AreYouSure
BNE.S chabno
MOVEM.L (SP)+,D0-D7/A0-A6
MOVEQ #0,D7
RTS
chabno MOVEM.L (SP)+,D0-D7/A0-A6
MOVEQ #-1,D7
RTS
StopIt BSR.S DoStopIt
TurnOffVoices
MOVEM.L A0-A1,-(SP)
MOVE.W #$000F,$DFF096
CLR.W $DFF0A8
CLR.W $DFF0B8
CLR.W $DFF0C8
CLR.W $DFF0D8
CLR.B RawKeyCode
LEA ScopeInfo,A0
LEA BlankSample,A1
MOVE.L A1,(A0)
MOVE.L A1,20(A0)
MOVE.L A1,40(A0)
MOVE.L A1,60(A0)
MOVEM.L (SP)+,A0-A1
RTS
DoStopIt
BSR SetNormalPtrCol
CLR.L EditMode
CLR.L RunMode
CLR.B PattDelayTime
CLR.B PattDelayTime2
BRA RestoreEffects2
UsePreset
BSR StorePtrCol
TST.L PLSTmem
BEQ.S upend
TST.W InsNum
BEQ.S upend
CLR.B RawKeyCode
MOVE.W CurrentPreset(PC),D0
SUBQ.W #1,D0
MULU #30,D0
MOVE.L PLSTmem(PC),A0
ADD.L D0,A0
MOVE.W InsNum(PC),D0
MULU #30,D0
MOVE.L SongDataPtr(PC),A1
LEA -10(A1,D0.W),A1
MOVE.L A1,A2
MOVEQ #29,D0
uploop MOVE.B (A0)+,(A1)+
DBRA D0,uploop
MOVE.L (A2),D0
AND.L #$DFDFFFFF,D0
CMP.L #$53540000,D0 ;ST__
BNE.S upok
CLR.W (A2)
CLR.L 22(A2)
MOVE.L #$00000001,26(A2)
upok BSR LoadPreset
upend BSR ShowSampleInfo
BRA RestorePtrCol
;---- Edit ----
Edit TST.W SamScrEnable
BNE Return2
BSR StopIt
CLR.B RawKeyCode
BSR SetEditPtrCol
BSR SetScrPatternPos
MOVE.L #'edit',EditMode
BRA WaitForButtonUp
;---- Edit Op. ----
DoEditOp
CLR.B RawKeyCode
CMP.W #1,CurrScreen
BNE Return2
TST.B EdEnable
BEQ.S EditOp
ADDQ.B #1,EdScreen
CMP.B #4,EdScreen
BLO.S EditOp
MOVE.B #1,EdScreen
EditOp BSR WaitForButtonUp
ST EdEnable
ST DisableAnalyzer
JSR ClearAnalyzerColors
BSR ClearRightArea
BRA DrawEditMenu
EdEnable dc.b 0
EdScreen dc.b 1
DrawEditMenu
CMP.B #1,EdScreen
BNE.S demskip
MOVE.L #EditOpText1,ShowTextPtr
LEA Edit1Data,A0
MOVE.L #Edit1Size,D0
BRA.S demit
demskip
CMP.B #2,EdScreen
BNE.S demskip2
MOVE.L #EditOpText2,ShowTextPtr
LEA Edit2Data,A0
MOVE.L #Edit2Size,D0
BRA.S demit
demskip2
CMP.B #3,EdScreen
BNE Return2
MOVE.L #EditOpText3,ShowTextPtr
LEA Edit3Data,A0
MOVE.L #Edit3Size,D0
demit BSR Decompact
BEQ ExitEditOp
LEA SpectrumAnaPos,A0
MOVEQ #54,D0
demloop1
MOVEQ #24,D1
demloop2
MOVE.B 1430(A1),10240(A0)
MOVE.B (A1)+,(A0)+
DBRA D1,demloop2
LEA 15(A0),A0
ADDQ.L #1,A1
DBRA D0,demloop1
BSR FreeDecompMem
MOVE.W #1936,TextOffset
MOVE.W #22,TextLength
BSR ShowText
CMP.B #1,EdScreen
BEQ ShowSampleAll
CMP.B #2,EdScreen
BNE.S demskip3
BSR ShowTrackPatt
BSR ShowFrom
BSR ShowTo
BSR ShowRecordMode
BSR ShowQuantize
BSR ShowMetronome
BRA ShowMultiMode
demskip3
CMP.B #3,EdScreen
BNE Return2
BSR ShowHalfClip
BSR ShowPos
BSR ShowMod
BRA ShowVol
EditOpText1 dc.b ' track pattern '
EditOpText2 dc.b ' record samples '
EditOpText3 dc.b ' sample editor '
CheckEditOpGadgs
MOVE.W PattCurPos(PC),D0
BSR.S GetPositionPtr
MOVEM.W MouseX2,D0/D1
CMP.W #306,D0
BHS.S CheckEdSwap
CMP.B #1,EdScreen
BEQ CheckEdGadg1
CMP.B #2,EdScreen
BEQ CheckEdGadg2
CMP.B #3,EdScreen
BEQ CheckEdGadg3
RTS
GetPositionPtr
MOVE.L SongDataPtr(PC),A0
LEA sd_patterndata(A0),A0
MOVE.L PatternNumber(PC),D2
LSL.L #8,D2
LSL.L #2,D2
ADD.L D2,A0
MOVEQ #0,D2
MOVE.W D0,D2
DIVU #6,D2
LSL.W #2,D2
ADD.W D2,A0
RTS
CheckEdSwap
CMP.W #55,D1
BLS Return2
MOVEQ #1,D2
CMP.W #66,D1
BLS.S SetEditOpScreen
MOVEQ #2,D2
CMP.W #77,D1
BLS.S SetEditOpScreen
MOVEQ #3,D2
CMP.W #88,D1
BLS.S SetEditOpScreen
CMP.W #99,D1
BLS.S ExitEditOp
RTS
SetEditOpScreen
MOVE.B D2,EdScreen
BRA EditOp
ExitEditOp
SF EdEnable
CLR.B RawKeyCode
BRA DisplayMainScreen
CheckEdGadg1
CMP.W #55,D1
BLS ToggleSampleAll
CMP.W #66,D1
BLS NoteUp
CMP.W #77,D1
BLS NoteDown
CMP.W #88,D1
BLS OctaveUp
CMP.W #99,D1
BLS OctaveDown
RTS
CheckEdGadg2
CMP.W #55,D1
BLS ToggleTrackPatt
CMP.W #213,D0
BLS.S ceg2left
CMP.W #66,D1
BLS DeleteOrKill
CMP.W #77,D1
BLS ExchangeOrCopy
CMP.W #88,D1
BLS SetSampleFrom
CMP.W #99,D1
BLS SetSampleTo
RTS
ceg2left
CMP.W #66,D1
BLS ToggleRecordMode
CMP.W #77,D1
BLS SetQuantize
CMP.W #88,D1
BLS SetMetronome
CMP.W #99,D1
BLS ToggleMultiMode
RTS
CheckEdGadg3
MOVE.L SongDataPtr(PC),A5
LEA -10(A5),A5
MOVE.W InsNum(PC),D2
BNE.S ceg3skip
MOVE.W LastInsNum,D2
ceg3skip
MULU #30,D2
ADD.L D2,A5
CMP.W #55,D1
BLS ToggleHalfClip
CMP.W #213,D0
BLS.S ceg3mid
CMP.W #66,D1
BLS SetSamplePos
CMP.W #77,D1
BLS SetModSpeed
CMP.W #88,D1
BLS CutBeg
CMP.W #99,D1
BLS ChangeVolume
RTS
ceg3mid CMP.W #165,D0
BLS.S ceg3left
CMP.W #66,D1
BLS Echo
CMP.W #77,D1
BLS Filter
CMP.W #88,D1
BLS Backwards
CMP.W #99,D1
BLS DownSample
RTS
ceg3left
CMP.W #66,D1
BLS Mix
CMP.W #77,D1
BLS Boost
CMP.W #88,D1
BLS XFade
CMP.W #99,D1
BLS UpSample
RTS
ToggleSampleAll
BSR WaitForButtonUp
EOR.B #1,SampleAllFlag
ShowSampleAll
LEA BitplaneData+1838,A1
LEA S_BoxData,A2
TST.B SampleAllFlag
BEQ rtdoit
LEA A_BoxData,A2
BRA rtdoit
OctaveUp
MOVE.W #24,NoteShift
BRA.S nup2
NoteUp MOVE.W #2,NoteShift
nup2 BSR SaveUndo
CMP.W #214,D0
BLS.S nup3
MOVEQ #0,D0
BSR GetPositionPtr
BSR.S SampleNoteUp
MOVEQ #6,D0
BSR GetPositionPtr
BSR.S SampleNoteUp
MOVEQ #12,D0
BSR GetPositionPtr
BSR.S SampleNoteUp
MOVEQ #18,D0
BSR GetPositionPtr
nup3 BSR.S SampleNoteUp
BRA RedrawPattern
SampleNoteUp
MOVEQ #63,D6
MOVE.L A0,A3
MOVE.W InsNum(PC),D3
TST.B SampleAllFlag
BEQ.S sanulo2
MOVEQ #0,D3
sanulo2 MOVE.L D6,D0
MOVE.L A3,A0
sanuloop
MOVE.B 2(A0),D1
LSR.B #4,D1
MOVE.B (A0),D2
AND.B #$F0,D2
OR.B D2,D1
CMP.B D3,D1
BNE.S sanuskip
MOVE.W (A0),D1
MOVE.W D1,D2
AND.W #$F000,D2
AND.W #$0FFF,D1
BEQ.S sanuskip
BSR CheckPeriod
BNE.S sanuskip
ADD.W NoteShift(PC),D5
CMP.W #$0048,D5
BLO.S sanuok
TST.B TransDelFlag
BEQ.S sanuskip
AND.L #$00000FFF,(A0)
BRA.S sanuskip
sanuok MOVE.W 0(A2,D5.W),D1
OR.W D2,D1
MOVE.W D1,(A0)
sanuskip
LEA 16(A0),A0
DBRA D0,sanuloop
TST.B SampleAllFlag
BEQ Return2
ADDQ.W #1,D3
CMP.W #32,D3
BLO.S sanulo2
RTS
OctaveDown
MOVE.W #24,NoteShift
BRA.S ndown2
NoteDown
MOVE.W #2,NoteShift
ndown2 BSR SaveUndo
CMP.W #214,D0
BLS.S ndown3
MOVEQ #0,D0
BSR GetPositionPtr
BSR.S SampleNoteDown
MOVEQ #6,D0
BSR GetPositionPtr
BSR.S SampleNoteDown
MOVEQ #12,D0
BSR GetPositionPtr
BSR.S SampleNoteDown
MOVEQ #18,D0
BSR GetPositionPtr
ndown3 BSR.S SampleNoteDown
BRA RedrawPattern
SampleNoteDown
MOVEQ #63,D6
MOVE.L A0,A3
MOVE.W InsNum(PC),D3
TST.B SampleAllFlag
BEQ.S sandlo2
MOVEQ #0,D3
sandlo2 MOVE.W D6,D0
MOVE.L A3,A0
sandloop
MOVE.B 2(A0),D1
LSR.B #4,D1
MOVE.B (A0),D2
AND.B #$F0,D2
OR.B D2,D1
CMP.B D1,D3
BNE.S sandskip
MOVE.W (A0),D1
MOVE.W D1,D2
AND.W #$F000,D2
AND.W #$0FFF,D1
BEQ.S sandskip
BSR.S CheckPeriod
BNE.S sandskip
SUB.W NoteShift(PC),D5
BPL.S sandok
TST.B TransDelFlag
BEQ.S sandskip
AND.L #$00000FFF,(A0)
BRA.S sandskip
sandok MOVE.W 0(A2,D5.W),D1
OR.W D2,D1
MOVE.W D1,(A0)
sandskip
LEA 16(A0),A0
DBRA D0,sandloop
TST.B SampleAllFlag
BEQ Return2
ADDQ.W #1,D3
CMP.W #$20,D3
BLO.S sandlo2
RTS
NoteShift
dc.w 0
CheckPeriod
LEA PeriodTable(PC),A2
MOVEQ #-2,D5
chpeloop
ADDQ.L #2,D5
MOVE.W 0(A2,D5.W),D4
BEQ.S PeriodNotOk
CMP.W D4,D1
BEQ.S PeriodOk
BRA.S chpeloop
PeriodOk
MOVEQ #0,D4
RTS
PeriodNotOk
MOVEQ #-1,D4
RTS
ToggleTrackPatt
BSR WaitForButtonUp
ADDQ.B #1,TrackPattFlag
CMP.B #3,TrackPattFlag
BLO.S ShowTrackPatt
CLR.B TrackPattFlag
ShowTrackPatt
LEA BitplaneData+1838,A1
LEA T_BoxData,A2
TST.B TrackPattFlag
BEQ rtdoit
LEA P_BoxData,A2
CMP.B #1,TrackPattFlag
BEQ rtdoit
LEA S_BoxData,A2
BRA rtdoit
KillInstrTrack
BSR SaveUndo
MOVE.W PattCurPos(PC),D0
BSR GetPositionPtr
BRA.S dst2
DeleteOrKill
CMP.W #260,D0
BHS KillSample
DelSampleTrack
BSR SaveUndo
TST.B TrackPattFlag
BEQ.S dst2
MOVEQ #0,D0
BSR GetPositionPtr
BSR.S dstdoit
MOVEQ #6,D0
BSR GetPositionPtr
BSR.S dstdoit
MOVEQ #12,D0
BSR GetPositionPtr
BSR.S dstdoit
MOVEQ #18,D0
BSR GetPositionPtr
dst2 BSR.S dstdoit
BRA RedrawPattern
dstdoit CLR.B RawKeyCode
MOVEQ #63,D0
MOVE.W InsNum(PC),D3
BEQ NotSampleNull
ksloop MOVE.B 2(A0),D1
LSR.B #4,D1
MOVE.B (A0),D2
AND.B #$F0,D2
OR.B D2,D1
CMP.B D1,D3
BNE.S ksskip
CLR.L (A0)
ksskip LEA 16(A0),A0
DBRA D0,ksloop
RTS
KillSample
LEA KillSampleText,A0
BSR AreYouSure
BNE Return2
Destroy BSR StorePtrCol
MOVE.W InsNum(PC),D0
BEQ ErrorRestoreCol
BSR TurnOffVoices
BSR FreeSample
MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D0
MULU #30,D0
LEA -10(A0),A0
ADD.L D0,A0
MOVE.L A0,A1
MOVEQ #29,D0
kisalop CLR.B (A0)+
DBRA D0,kisalop
MOVE.W #1,28(A1)
BSR ShowSampleInfo
BSR RedrawSample
BRA RestorePtrCol
ExchangeOrCopy
MOVEQ #-1,D4
CMP.W #260,D0
BHS.S CopySampleTrack
ExchSampleTrack
CMP.B #2,TrackPattFlag
BEQ ExchSamples
MOVEQ #0,D4
BRA.S mstskip
CopySampleTrack
CMP.B #2,TrackPattFlag
BEQ CopySamples
mstskip TST.B TrackPattFlag
BEQ.S mst2
MOVEQ #0,D0
BSR GetPositionPtr
BSR.S mstdoit
MOVEQ #6,D0
BSR GetPositionPtr
BSR.S mstdoit
MOVEQ #12,D0
BSR GetPositionPtr
BSR.S mstdoit
MOVEQ #18,D0
BSR GetPositionPtr
mst2 BSR.S mstdoit
BRA RedrawPattern
mstdoit MOVEQ #63,D0
esloop MOVE.B 2(A0),D1
LSR.B #4,D1
MOVE.B (A0),D2
AND.B #$F0,D2
OR.B D2,D1
CMP.B SampleFrom(PC),D1
BNE.S esskip2
AND.L #$0FFF0FFF,(A0)
MOVE.B SampleTo(PC),D2
MOVE.B D2,D3
AND.B #$F0,D2
OR.B D2,(A0)
LSL.B #4,D3
OR.B D3,2(A0)
BRA.S esskip3
esskip2 TST.B D4
BNE.S esskip3
CMP.B SampleTo(PC),D1
BNE.S esskip3
AND.L #$0FFF0FFF,(A0)
MOVE.B SampleFrom(PC),D2
MOVE.B D2,D3
AND.B #$F0,D2
OR.B D2,(A0)
LSL.B #4,D3
OR.B D3,2(A0)
esskip3 LEA 16(A0),A0
DBRA D0,esloop
RTS
ExchSamples
BSR StorePtrCol
MOVEQ #0,D0
MOVE.B SampleFrom(PC),D0
BEQ ErrorRestoreCol
MOVEQ #0,D1
MOVE.B SampleTo(PC),D1
BEQ ErrorRestoreCol
MOVE.W D0,D2
MOVE.W D1,D3
LEA SampleLengthAdd+2,A2
LSL.W #1,D2
LSL.W #1,D3
LEA (A2,D2.W),A0
LEA (A2,D3.W),A1
MOVE.W (A0),D4
MOVE.W (A1),(A0)
MOVE.W D4,(A1)
LEA SamplePtrs,A2
LSL.W #1,D2
LSL.W #1,D3
LEA (A2,D2.W),A0
LEA (A2,D3.W),A1
MOVE.L (A0),D4
MOVE.L (A1),(A0)
MOVE.L D4,(A1)
MOVE.L 124(A0),D4
MOVE.L 124(A1),124(A0)
MOVE.L D4,124(A1)
SUBQ.W #1,D0
SUBQ.W #1,D1
MULU #30,D0
MULU #30,D1
MOVE.L SongDataPtr(PC),A2
LEA 20(A2),A2
LEA (A2,D0.W),A0
LEA (A2,D1.W),A1
MOVEQ #29,D0
exsalop MOVE.B (A0),D1
MOVE.B (A1),(A0)+
MOVE.B D1,(A1)+
DBRA D0,exsalop
BSR ShowSampleInfo
BSR RedrawSample
BRA RestorePtrCol
CopySamples
BSR StorePtrCol
MOVEQ #0,D0
MOVE.B SampleFrom(PC),D0
BEQ ErrorRestoreCol
MOVEQ #0,D1
MOVE.B SampleTo(PC),D1
BEQ ErrorRestoreCol
LEA SamplePtrs(PC),A2
LSL.W #2,D0
LSL.W #2,D1
LEA (A2,D0.W),A3
LEA (A2,D1.W),A4
MOVE.L (A3),D0
BEQ ErrorRestoreCol
MOVE.L 124(A3),D0
MOVEQ #MEMF_CHIP,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
TST.L D0
BEQ OutOfMemErr
MOVE.L D0,A5
MOVEQ #0,D0
MOVE.B SampleTo(PC),D0
MOVE.W D0,InsNum
BSR Destroy
MOVE.L A5,(A4)
MOVE.L 124(A3),D0
MOVE.L D0,124(A4)
MOVE.L (A3),A0
cosalp2 MOVE.B (A0)+,(A5)+
SUBQ.L #1,D0
BNE.S cosalp2
MOVEQ #0,D0
MOVEQ #0,D1
MOVE.B SampleFrom(PC),D0
MOVE.B SampleTo(PC),D1
MOVE.W D1,InsNum
MULU #30,D0
MULU #30,D1
MOVE.L SongDataPtr(PC),A2
LEA -10(A2),A2
LEA (A2,D0.W),A0
LEA (A2,D1.W),A1
MOVEQ #29,D0
cosalop MOVE.B (A0)+,(A1)+
DBRA D0,cosalop
BSR ShowSampleInfo
BSR RedrawSample
BRA RestorePtrCol
SetSampleFrom
MOVE.W InsNum(PC),D2
CMP.W #283,D0
BLS.S sesfskip
MOVE.B SampleFrom(PC),D2
CMP.W #295,D0
BLS.S sesfup
SUBQ.B #1,D2
BPL.S sesfskip
MOVEQ #0,D2
sesfskip
MOVE.B D2,SampleFrom
BSR Wait_4000
BRA.S ShowFrom
sesfup ADDQ.B #1,D2
CMP.B #$1F,D2
BLS.S sesfskip
MOVE.B #$1F,SampleFrom
ShowFrom
MOVE.W #3273,TextOffset
CLR.W WordNumber
MOVE.B SampleFrom(PC),WordNumber+1
BRA PrintHexByte
SetSampleTo
MOVE.W InsNum(PC),D2
CMP.W #283,D0
BLS.S sestskip
MOVE.B SampleTo(PC),D2
CMP.W #295,D0
BLS.S sestup
SUBQ.B #1,D2
BPL.S sestskip
MOVEQ #0,D2
sestskip
MOVE.B D2,SampleTo
BSR Wait_4000
BRA.S ShowTo
sestup ADDQ.B #1,D2
CMP.B #$1F,D2
BLS.S sestskip
MOVE.B #$1F,SampleTo
ShowTo MOVE.W #3713,TextOffset
CLR.W WordNumber
MOVE.B SampleTo(PC),WordNumber+1
BRA PrintHexByte
SampleFrom dc.b 0
SampleTo dc.b 0
ToggleRecordMode
BSR WaitForButtonUp
EOR.B #1,RecordMode
ShowRecordMode
MOVE.W #2382,D1
LEA PattText,A0
TST.B RecordMode
BEQ.S srmskip
LEA SongText,A0
srmskip MOVEQ #4,D0
BRA ShowText3
PattText dc.b 'patt'
SongText dc.b 'song'
RecordMode dc.b 0
QuantizeValue dc.b 1
MetroSpeed dc.b 4
MetroChannel dc.b 0
MultiFlag dc.b 0
SampleAllFlag dc.b 0
TrackPattFlag dc.b 0
ClipHalveFlag dc.b 0
AbortDecFlag dc.w 0
GetDecByte
MOVE.W #1,AbortDecFlag
BSR StorePtrCol
BSR SetWaitPtrCol
BSR UpdateLineCurPos
BSR GetKey0_9
CMP.B #68,D1
BEQ.S gdbexit
MOVE.B D1,D0
MULU #10,D0
MOVE.B D0,GetDecTemp
BSR ShowOneDigit
ADDQ.W #8,LineCurX
BSR UpdateLineCurPos
BSR GetKey0_9
CMP.B #68,D1
BEQ.S gdbexit
ADD.B D1,GetDecTemp
CLR.W AbortDecFlag
gdbexit CLR.W LineCurX
MOVE.W #270,LineCurY
BSR UpdateLineCurPos
BSR RestorePtrCol
MOVE.B GetDecTemp,D0
RTS
SetQuantize
CLR.B RawKeyCode
MOVE.W #196,LineCurX
MOVE.W #76,LineCurY
MOVE.W #2824,TextOffset
BSR GetDecByte
TST.W AbortDecFlag
BNE ShowQuantize
CMP.B #63,D0
BLS.S tqskip
MOVEQ.B #63,D0
tqskip MOVE.B D0,QuantizeValue
ShowQuantize
MOVE.W #2824,TextOffset
CLR.W WordNumber
MOVE.B QuantizeValue,WordNumber+1
BRA Print2DecDigits
SetMetronome
CLR.B RawKeyCode
CMP.W #188,D0
BHS.S smchan
MOVE.W #3261,TextOffset
MOVE.W #172,LineCurX
MOVE.W #87,LineCurY
BSR GetDecByte
TST.W AbortDecFlag
BNE ShowMetronome
CMP.B #64,D0
BLS.S smexit
MOVEQ.B #64,D0
smexit MOVE.B D0,MetroSpeed
BRA.S ShowMetronome
smchan MOVE.W #3264,TextOffset
BSR GetHexByte
CMP.W #4,D0
BLS.S smexit2
MOVEQ #4,D0
smexit2 MOVE.B D0,MetroChannel
ShowMetronome
MOVE.W #3261,TextOffset
CLR.W WordNumber
MOVE.B MetroSpeed,WordNumber+1
BSR Print2DecDigits
MOVE.W #3264,TextOffset
CLR.W WordNumber
MOVE.B MetroChannel,WordNumber+1
BRA Print2DecDigits
ToggleMultiMode
BSR WaitForButtonUp
CLR.B RawKeyCode
EOR.B #1,MultiFlag
ShowMultiMode
BSR.S Show_MS
CMP.W #1,CurrScreen
BNE Return2
CMP.B #2,EdScreen
BNE Return2
TST.B EdEnable
BEQ Return2
MOVE.W #3700,D1
LEA SingleText(PC),A0
TST.B MultiFlag
BEQ.S smmskip
LEA MultiText(PC),A0
smmskip MOVEQ #6,D0
BRA ShowText3
SingleText dc.b 'single'
MultiText dc.b ' multi'
Show_MS CMP.W #4,CurrScreen
BEQ Return2
MOVE.B #' ',D0
TST.B MultiFlag
BEQ.S smsskp1
MOVE.B #'M',D0
smsskp1 MOVE.B #' ',D1
TST.B SplitFlag
BEQ.S smsskp2
MOVE.B #'S',D1
smsskp2 MOVE.B D0,mstext
MOVE.B D1,mstext+1
MOVE.W #4121,D1
MOVEQ #2,D0
LEA mstext(PC),A0
BSR ShowText3
BRA ShowAutoInsert
mstext dc.b '__'
;---- Edit Op. 3 ----
ToggleHalfClip
BSR WaitForButtonUp
EOR.B #1,HalfClipFlag
ShowHalfClip
LEA BitplaneData+1838,A1
LEA H_BoxData,A2
TST.B HalfClipFlag
BEQ.S ogaoga
LEA C_BoxData,A2
ogaoga JMP rtdoit
SetSamplePos
MOVE.L SamplePos(PC),D2
CMP.W #283,D0
BLS Return2
CMP.W #295,D0
BLS.S shpoup
SUBQ.L #1,D2
BTST #2,$DFF016
BNE.S shposkip
SUB.L #15,D2
shposkip
BPL.S shposkip2
MOVEQ #0,D2
shposkip2
MOVE.L D2,SamplePos
BRA.S ShowPos
shpoup ADDQ.L #1,D2
BTST #2,$DFF016
BNE.S shposkip3
ADD.L #15,D2
shposkip3
MOVEQ #0,D3
MOVE.W 22(A5),D3
LSL.L #1,D3
CMP.L D3,D2
BLS.S shposkip2
MOVE.L D3,SamplePos
ShowPos CMP.W #1,CurrScreen
BNE Return2
TST.B EdEnable
BEQ Return2
CMP.B #3,EdScreen
BNE Return2
MOVE.W #2391,TextOffset
MOVE.W SamplePos+2(PC),WordNumber
BRA PrintHexWord
SetModSpeed
CMP.W #243,D0
BLS DoMod
MOVEQ #0,D2
BTST #2,$DFF016
BEQ.S semoskp
MOVE.B ModSpeed,D2
CMP.W #283,D0
BLS Return2
CMP.W #295,D0
BLS.S semoup
SUB.B #1,D2
CMP.B #127,D2
BNE.S semoskp
MOVE.B #128,D2
BRA.S semoskp
semoup ADD.B #1,D2
CMP.B #128,D2
BNE.S semoskp
MOVEQ #127,D2
semoskp MOVE.B D2,ModSpeed
BSR Wait_4000
ShowMod LEA PlusMinusText(PC),A0
MOVEQ #0,D6
MOVE.B ModSpeed,D6
BPL.S shmoskp
NEG.B D6
ADDQ.L #1,A0
shmoskp MOVEQ #1,D0
MOVE.W #2831,D1
BSR ShowText3
MOVE.W D6,WordNumber
BRA Print3DecDigits
PlusMinusText dc.b ' -'
DoMod BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D2
MOVE.W SampleInfo(PC),D2
BEQ ErrorRestoreCol
LSL.W #1,D2
SUBQ.W #1,D2
MOVE.L si_pointer,D0
BEQ ErrorRestoreCol
BSR AllocBuffer
MOVE.L D0,A2
MOVE.L D0,A3
MOVE.L A1,A4
ADD.L D2,A3
CLR.L ModOffset
CLR.L ModPos
dmoloop CMP.L A3,A2
BHS.S dmoskip
MOVE.B (A1),(A2)+
BSR.S UpdateMod
BRA.S dmoloop
dmoskip MOVE.L si_pointer(PC),A1
CLR.W (A1)
BSR FreeBuffer
BSR RestorePtrCol
BRA DisplaySample
UpdateMod
MOVE.B ModSpeed(PC),D0
BEQ.S upmplus
EXT.W D0
EXT.L D0
MOVE.L ModPos(PC),D1
ADD.L D0,D1
MOVE.L D1,ModPos
ASR.L #8,D1
ASR.L #4,D1
MOVE.L D1,D3
AND.W #$1F,D1
LEA VibratoTable,A0
MOVEQ #0,D0
MOVE.B (A0,D1.W),D0
LSR.B #2,D0
MOVE.L ModOffset(PC),D1
BTST #5,D3
BEQ.S upmskip
SUB.L D0,D1
BRA.S upmskp2
upmskip ADD.L D0,D1
upmskp2 ADD.L #$800,D1
MOVE.L D1,ModOffset
ASR.L #8,D1
ASR.L #3,D1
BPL.S upmskp3
MOVEQ #0,D1
upmskp3 CMP.L D2,D1
BLO.S upmskp4
MOVE.L D2,D1
upmskp4 MOVE.L A4,A1
ADD.L D1,A1
RTS
upmplus ADDQ.L #1,A1
RTS
CutBeg CMP.W #283,D0
BHI FadeDown
CMP.W #259,D0
BHI FadeUp
BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D3
MOVE.W SampleInfo(PC),D3
BEQ ErrorRestoreCol
LSL.W #1,D3
SUBQ.W #1,D3
MOVE.L si_pointer,D0
BEQ ErrorRestoreCol
MOVE.L D0,A1
MOVE.L D0,A2
MOVE.L D0,A3
ADD.L SamplePos(PC),A2
ADD.L D3,A3
cbeloop CMP.L A3,A2
BHS.S cbeskip
MOVE.B (A2),D0
CLR.B (A2)+
MOVE.B D0,(A1)+
BRA.S cbeloop
cbeskip MOVE.L si_pointer(PC),A2
CLR.W (A2)
SUB.L A2,A1
MOVE.L A1,D0
LSR.L #1,D0
ADDQ.L #1,D0
AND.W #$7FFF,D0
MOVE.W D0,22(A5)
BSR ShowSampleInfo
BSR RestorePtrCol
BRA DisplaySample
FadeUp BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D3
MOVE.W SampleInfo(PC),D3
BEQ ErrorRestoreCol
MOVEQ #0,D1
MOVE.L SamplePos(PC),D2
BEQ ErrorRestoreCol
MOVE.L si_pointer,D0
BEQ ErrorRestoreCol
MOVE.L D0,A0
LSR.W #1,D2
BEQ ErrorRestoreCol
MOVEQ #0,D4
fuloop MOVE.B (A0),D0
EXT.W D0
MULS D1,D0
DIVS D2,D0
MOVE.B D0,(A0)+
ADDQ.W #1,D4
MOVE.W D4,D1
LSR.W #1,D1
CMP.W D2,D1
BLO.S fuloop
BSR RestorePtrCol
BRA DisplaySample
FadeDown
BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D3
MOVE.W SampleInfo(PC),D3
BEQ ErrorRestoreCol
LSL.L #1,D3
SUBQ.L #1,D3 ;Length-1
MOVE.L SamplePos(PC),D2
CMP.L D3,D2
BHS ErrorRestoreCol
MOVE.L D3,D4 ; Copy length to D4
SUB.L D2,D3 ; Length-pos
MOVE.L D3,D2 ; Copy offset to D2
MOVE.L si_pointer,D0
BEQ ErrorRestoreCol
MOVE.L D0,A0
LEA (A0,D4.L),A0 ;Start at end of sample
LSR.W #1,D2
BEQ ErrorRestoreCol
MOVEQ #0,D1
MOVEQ #0,D4
fdloop MOVE.B (A0),D0
EXT.W D0
MULS D1,D0
DIVS D2,D0
MOVE.B D0,(A0)
SUBQ.L #1,A0
ADDQ.W #1,D4
MOVE.W D4,D1
LSR.W #1,D1
CMP.W D2,D1
BLO.S fdloop
BSR RestorePtrCol
BRA DisplaySample
ChangeVolume
MOVE.W SampleVol(PC),D2
CMP.W #243,D0
BLS DoChangeVol
CMP.W #283,D0
BLS Return2
CMP.W #295,D0
BLS shvoup
SUBQ.W #1,D2
BTST #2,$DFF016
BNE.S shvoskip
SUB.W #9,D2
shvoskip
BPL.S shvoskip2
MOVEQ #0,D2
shvoskip2
MOVE.W D2,SampleVol
BSR Wait_4000
BRA.S ShowVol
shvoup ADDQ.L #1,D2
BTST #2,$DFF016
BNE.S shvoskip3
ADD.W #9,D2
shvoskip3
CMP.W #999,D2
BLS.S shvoskip2
MOVE.W #999,SampleVol
BSR Wait_4000
ShowVol MOVE.W #3711,TextOffset
MOVE.W SampleVol(PC),WordNumber
BSR Print3DecDigits
LEA PercentText(PC),A0
MOVE.W #1,TextLength
BRA ShowText2
PercentText dc.b '%',0
DoChangeVol
BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D3
MOVE.W SampleInfo(PC),D3
BEQ ErrorRestoreCol
LSL.W #1,D3
SUBQ.W #1,D3
MOVE.L si_pointer,D0
BEQ ErrorRestoreCol
MOVE.L D0,A1
MOVE.W SampleVol(PC),D0
dcvloop MOVE.B (A1),D1
EXT.W D1
MULS D0,D1
DIVS #100,D1
CMP.W #127,D1
BLE.S dcvskip
MOVEQ #127,D1
dcvskip CMP.W #-128,D1
BGE.S dcvskp2
MOVEQ #-128,D1
dcvskp2 MOVE.B D1,(A1)+
DBRA D3,dcvloop
MOVE.L si_pointer(PC),A1
CLR.W (A1)
BSR RestorePtrCol
BRA DisplaySample
Mix BTST #2,$DFF016
BEQ OldMix
BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVE.W #1,GetLineFlag
MOVE.W #4,MixCurPos
mixlopx BSR DisplayMix
BSR GetHexKey
TST.B D0
BNE.S mixnzro
CMP.B #68,MixChar
BEQ Mix2
CMP.B #69,MixChar
BEQ EndMix
BTST #2,$DFF016
BEQ EndMix
mixpchr LEA MixText(PC),A0
LEA FastHexTable+1,A1
LSL.W #1,D1
MOVE.W MixCurPos(PC),D0
MOVE.B (A1,D1.W),(A0,D0.W)
MixMoveRight
MOVE.W MixCurPos,D0
ADDQ.W #1,D0
CMP.W #6,D0
BEQ.S mmrp1
CMP.W #9,D0
BEQ.S mmrp2
CMP.W #15,D0
BHS.S mmrp3
mmrok MOVE.W D0,MixCurPos
BRA mixlopx
mmrp1 MOVEQ #7,D0
BRA.S mmrok
mmrp2 MOVEQ #13,D0
BRA.S mmrok
mmrp3 MOVEQ #14,D0
BRA.S mmrok
mixnzro CMP.B #1,D0
BEQ.S MixMoveRight
MixMoveLeft
MOVE.W MixCurPos,D0
SUBQ.W #1,D0
CMP.W #4,D0
BLO.S mmlp1
CMP.W #6,D0
BEQ.S mmlp2
CMP.W #12,D0
BEQ.S mmlp3
BRA.S mmrok
mmlp1 MOVEQ #4,D0
BRA.S mmrok
mmlp2 MOVEQ #5,D0
BRA.S mmrok
mmlp3 MOVEQ #8,D0
BRA.S mmrok
DisplayMix
MOVE.W #53,LineCurY
MOVE.W MixCurPos,D0
LSL.W #3,D0
ADD.W #132,D0
MOVE.W D0,LineCurX
BSR UpdateLineCurPos
LEA MixText(PC),A0
MOVE.W #1936,D1
MOVEQ #22,D0
BSR ShowText3
BSR Wait_4000
BSR Wait_4000
BRA Wait_4000
MixText dc.b 'mix 01+02 to 03 '
MixChar dc.b 0,0
MixCurPos dc.w 0
ToSam dc.w 0
FromPtr1 dc.l 0
FromPtr2 dc.l 0
ToPtr dc.l 0
MixPtr dc.l 0
MixLength dc.l 0
EndMix CLR.B RawKeyCode
BSR RestoreMix
BRA RestorePtrCol
RestoreMix
CLR.W GetLineFlag
MOVE.W #270,LineCurY
CLR.W LineCurX
BSR UpdateLineCurPos
LEA EditOpText3(PC),A0
MOVE.W #1936,D1
MOVEQ #22,D0
BRA ShowText3
Mix2 BSR RestoreMix
BSR TurnOffVoices
LEA SamplePtrs,A2
MOVEQ #0,D0
LEA MixText+4(PC),A0
BSR HexToInteger2
TST.W D0
BEQ SamOutOfRange
CMP.W #$1F,D0
BHI SamOutOfRange
LSL.W #2,D0
LEA (A2,D0.W),A3
MOVE.L A3,FromPtr1
MOVEQ #0,D0
LEA MixText+7(PC),A0
BSR HexToInteger2
TST.W D0
BEQ SamOutOfRange
CMP.W #$1F,D0
BHI SamOutOfRange
LSL.W #2,D0
LEA (A2,D0.W),A3
MOVE.L A3,FromPtr2
MOVEQ #0,D0
LEA MixText+13(PC),A0
BSR HexToInteger2
MOVE.W D0,ToSam
BEQ SamOutOfRange
CMP.W #$1F,D0
BHI SamOutOfRange
LSL.W #2,D0
LEA (A2,D0.W),A3
MOVE.L A3,ToPtr
MOVE.L FromPtr1,A1
MOVE.L FromPtr2,A2
MOVE.L 124(A1),D1
MOVE.L 124(A2),D2
CMP.L D1,D2
BLO.S mixnswp
EXG D1,D2
mixnswp TST.L D1
BEQ SamEmptyError ; Both samples had length=0
MOVE.L D1,D0
AND.L #$FFFF,D0
MOVE.L D0,MixLength
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,MixPtr
BEQ SamMemError ; No memory for new sample...
LEA MixingText(PC),A0
BSR ShowStatusText
MOVE.L FromPtr1(PC),A1
MOVE.L 124(A1),D1
MOVE.L (A1),A1
MOVE.L FromPtr2(PC),A2
MOVE.L 124(A2),D2
MOVE.L (A2),A2
MOVE.L MixPtr(PC),A3
MOVE.L MixLength,D3
TST.W D1
BEQ.S mixnd1
SUBQ.W #1,D1
mixnd1 TST.W D2
BEQ.S mixnd2
SUBQ.W #1,D2
mixnd2 SUBQ.W #1,D3
mixlop2 MOVE.B (A1),D4
EXT.W D4
MOVE.B (A2),D0
EXT.W D0
ADD.W D4,D0
TST.B HalfClipFlag
BEQ mixhalf
CMP.W #127,D0
BLE.S mixnbig
MOVEQ #127,D0
mixnbig CMP.W #-128,D0
BGE mixokok
MOVEQ #-128,D0
BRA mixokok
mixhalf ASR.W #1,D0
mixokok MOVE.B D0,(A3)+
TST.W D1
BEQ.S zerd1
ADDQ.L #1,A1
SUBQ.W #1,D1
BNE.S zerd1
SUB.L A1,A1
zerd1 TST.W D2
BEQ.S zerd2
ADDQ.L #1,A2
SUBQ.W #1,D2
BNE.S zerd2
SUB.L A2,A2
zerd2 DBRA D3,mixlop2
MOVE.W ToSam(PC),InsNum
BSR FreeSample
MOVE.L ToPtr(PC),A0
MOVE.L MixPtr(PC),A1
CLR.W (A1)
MOVE.L A1,(A0)
MOVE.L MixLength(PC),124(A0)
MOVE.L SongDataPtr(PC),A0
MOVE.W ToSam(PC),D0
SUBQ.W #1,D0
MULU #30,D0
LEA 20(A0,D0.W),A0
MOVE.L MixLength(PC),D0
LSR.W #1,D0
MOVE.W D0,22(A0)
MOVE.W #$0040,24(A0)
MOVE.W #$0000,26(A0)
MOVE.W #$0001,28(A0)
BSR RestorePtrCol
BSR ShowAllRight
BSR ShowSampleInfo
BRA DisplaySample
SamOutOfRange
LEA mixerrtext1(PC),A0
BSR ShowStatusText
BRA ErrorRestoreCol
SamEmptyError
LEA mixerrtext2(PC),A0
BSR ShowStatusText
BRA ErrorRestoreCol
SamMemError
LEA mixerrtext3(PC),A0
BSR ShowStatusText
BRA ErrorRestoreCol
OutOfMemErr
LEA mixerrtext3(PC),A0
BSR ShowStatusText
BSR SetErrorPtrCol
MOVEQ #0,D0
RTS
mixerrtext1 dc.b 'not range 01-1F !',0
mixerrtext2 dc.b 'empty samples !!!',0
mixerrtext3 dc.b 'out of memory !!!',0
mixingtext dc.b 'mixing samples...',0
OldMix MOVE.L SamplePos(PC),FlangePos
DoMix BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D2
MOVE.W SampleInfo(PC),D2 ; 22(A0)
BEQ Return2
LSL.W #1,D2
MOVE.L si_pointer(PC),D0
BEQ ErrorRestoreCol
BSR AllocBuffer
MOVE.L D0,A2
MOVE.L D0,A3
MOVE.L A1,A4
ADD.L D2,A3
ADD.L FlangePos(PC),A2
CLR.L ModOffset
CLR.L ModPos
MOVEQ #-1,D7
mixloop ADDQ.L #1,D7
CMP.L A3,A2
BHS mixskip
MOVE.L MarkStartOfs(PC),D0
BMI.S omxget
MOVE.L MarkEndOfs(PC),D1
CMP.L D0,D1
BEQ.S omxget
CMP.L D0,D7
BLO.S omxok2
CMP.L D1,D7
BHI.S omxok2
omxget MOVE.B (A2),D0
EXT.W D0
MOVE.B (A1),D1
EXT.W D1
ADD.W D1,D0
TST.B HalfClipFlag
BEQ.S omxhalf
CMP.W #127,D0
BLE.S omxnbig
MOVEQ #127,D0
omxnbig CMP.W #-128,D0
BGE.S omxokok
MOVEQ #-128,D0
BRA.S omxokok
omxhalf ASR.W #1,D0
omxokok MOVE.B D0,(A2)+
BSR UpdateMod
BRA.S mixloop
omxok2 ADDQ.L #1,A2
BSR UpdateMod
BRA.S mixloop
mixskip MOVE.L si_pointer(PC),A1
CLR.W (A1)
BSR FreeBuffer
BSR RestorePtrCol
BSR WaitForButtonUp
TST.W DispOrRedraw
BEQ DisplaySample
CLR.W DispOrRedraw
BRA RedrawSample
DispOrRedraw dc.w 0
AllocBuffer
MOVE.L D0,D7
MOVE.L D2,D0
MOVE.L D2,BufMemSize
MOVE.L #MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,BufMemPtr
BEQ OutOfMemErr
MOVE.L D7,A0
MOVE.L D0,A1
MOVE.L BufMemSize(PC),D0
SUBQ.L #1,D0
albloop MOVE.B (A0)+,(A1)+
DBRA D0,albloop
MOVE.L BufMemPtr(PC),A1
MOVE.L D7,D0
RTS
FreeBuffer
MOVE.L BufMemPtr(PC),D0
BEQ Return2
MOVE.L D0,A1
MOVE.L BufMemSize(PC),D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
CLR.L BufMemPtr
RTS
Echo MOVE.L SamplePos(PC),FlangePos
BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D2
MOVE.W SampleInfo(PC),D2 ; 22(A0)
BEQ ErrorRestoreCol
LSL.W #1,D2
MOVE.L si_pointer(PC),D0
BEQ ErrorRestoreCol
MOVE.L D0,A1
MOVE.L D0,A2
MOVE.L D0,A3
MOVE.L D0,A4
ADD.L D2,A3
ADD.L FlangePos(PC),A2
CLR.L ModOffset
CLR.L ModPos
flaloop CMP.L A3,A2
BHS flaskip
MOVE.B (A2),D0
EXT.W D0
MOVE.B (A1),D1
EXT.W D1
ADD.W D1,D0
ASR.W #1,D0
MOVE.B D0,(A2)+
BSR UpdateMod
BRA flaloop
flaskip MOVE.L si_pointer(PC),A1
CLR.W (A1)
BSR RestorePtrCol
TST.B HalfClipFlag
BEQ DisplaySample
MOVE.W SampleVol,-(SP)
MOVE.W #200,SampleVol
BSR DoChangeVol
MOVE.W (SP)+,SampleVol
BRA DisplaySample
Filter2 MOVE.W #1,DispOrRedraw
Filter CLR.B RawKeyCode
LEA FilteringText,A0
BSR ShowStatusText
MOVE.L #1,FlangePos
MOVE.B ModSpeed(PC),-(SP)
MOVE.B HalfClipFlag,-(SP)
CLR.B ModSpeed
CLR.B HalfClipFlag
BSR DoMix
MOVE.B (SP)+,HalfClipFlag
MOVE.B (SP)+,ModSpeed
BRA ShowAllRight
FilteringText dc.b 'filtering',0
Boost BSR.S Boost3
BRA DisplaySample
Boost2 BSR.S Boost3
BRA RedrawSample
Boost3 CLR.B RawKeyCode
BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
LEA BoostingText,A0
BSR ShowStatusText
MOVEQ #0,D3
MOVE.W SampleInfo(PC),D3
BEQ booend
LSL.W #1,D3
SUBQ.W #1,D3
MOVE.L si_pointer(PC),D0
BEQ booend
MOVE.L D0,A1
MOVE.L MarkStartOfs(PC),D0
BMI.S booskp1
MOVE.L MarkEndOfs(PC),D1
SUB.L D0,D1
BEQ.S booskp1
MOVE.L D1,D3
MOVE.L SamStart(PC),A1
ADD.L D0,A1
booskp1 MOVEQ #0,D0
booloop MOVE.B (A1),D1
EXT.W D1
MOVE.W D1,D2
SUB.W D0,D1
MOVE.W D2,D0
TST.W D1
BMI booneg
ASR.W #2,D1
ADD.W D1,D2
BRA booskip
booneg NEG.W D1
ASR.W #2,D1
SUB.W D1,D2
booskip CMP.W #127,D2
BLE booskp2
MOVEQ #127,D2
booskp2 CMP.W #-128,D2
BGE booskp3
MOVEQ #-128,D2
booskp3 MOVE.B D2,(A1)+
DBRA D3,booloop
MOVE.L si_pointer(PC),A1
CLR.W (A1)
booend BSR ShowAllRight
BRA RestorePtrCol
BoostingText dc.b 'boosting',0,0
XFade BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D2
MOVE.W SampleInfo(PC),D2 ; 22(A0)
BEQ ErrorRestoreCol
ADD.W D2,D2
MOVE.L si_pointer(PC),D0
BEQ ErrorRestoreCol
MOVE.L D0,A1
MOVE.L D0,A2
ADD.L D2,A2
xfaloop MOVE.B (A1),D0
EXT.W D0
MOVE.B -(A2),D1
EXT.W D1
ADD.W D1,D0
TST.B HalfClipFlag
BEQ xfahalf
CMP.W #127,D0
BLE xfanbig
MOVEQ #127,D0
xfanbig CMP.W #-128,D0
BGE xfaokok
MOVEQ #-128,D0
BRA xfaokok
xfahalf ASR.W #1,D0
xfaokok MOVE.B D0,(A1)+
MOVE.B D0,(A2)
CMP.L A2,A1
BLO.S xfaloop
MOVE.L si_pointer(PC),A1
CLR.W (A1)
BSR RestorePtrCol
BRA DisplaySample
Backwards
BSR WaitForButtonUp
BSR StorePtrCol
BSR SetWaitPtrCol
MOVEQ #0,D2
MOVE.W 22(A5),D2
BEQ ErrorRestoreCol
MOVE.L si_pointer(PC),D0
BEQ ErrorRestoreCol
MOVE.L D0,A1
MOVE.L D0,A2
ADD.L D2,D2
ADD.L D2,A2
MOVE.L MarkStartOfs(PC),D0
BMI.S bacloop
MOVE.L MarkEndOfs(PC),D1
SUB.L D0,D1
BEQ.S bacloop
MOVE.L SamStart(PC),A1
ADD.L D0,A1
MOVE.L A1,A2
ADD.L D1,A2
bacloop MOVE.B (A1),D0
MOVE.B -(A2),(A1)+
MOVE.B D0,(A2)
CMP.L A2,A1
BLO.S bacloop
MOVE.L si_pointer(PC),A1
CLR.W (A1)
BSR RestorePtrCol
BRA DisplaySample
Upsample
BSR WaitForButtonUp
LEA UpsampleText,A0
BSR AreYouSure
BNE Return2
BSR TurnOffVoices
BSR StorePtrCol
BSR SetWaitPtrCol
MOVE.W InsNum(PC),D0
LSL.W #2,D0
LEA SamplePtrs(PC),A0
LEA (A0,D0.W),A0
MOVE.L 124(A0),D3
CMP.L #2,D3
BLS ErrorRestoreCol
MOVE.L (A0),D0
BEQ ErrorRestoreCol
MOVE.L D0,A2
MOVE.L D0,A4
MOVE.L D3,D4
LSR.L #1,D3
BCLR #0,D3
MOVE.L D3,D0
MOVEQ #MEMF_CHIP,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
TST.L D0
BEQ.S upserro
MOVE.L D0,A3
MOVE.L D0,D2
MOVE.L D3,D5
SUBQ.L #1,D3
upsloop MOVE.B (A2)+,(A3)+
ADDQ.L #1,A2
DBRA D3,upsloop
MOVE.L A4,A1
MOVE.L D4,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
MOVE.W InsNum(PC),D0
LSL.W #2,D0
LEA SamplePtrs(PC),A0
LEA (A0,D0.W),A0
MOVE.L D2,(A0)
MOVE.L D5,124(A0)
MOVE.L D2,A0
CLR.W (A0)
MOVE.W 22(A5),D0
LSR.W #1,D0
MOVE.W D0,22(A5)
MOVE.W 26(A5),D0
LSR.W #1,D0
MOVE.W D0,26(A5)
MOVE.W 28(A5),D0
LSR.W #1,D0
BNE upsskip2
MOVEQ #1,D0
upsskip2
MOVE.W D0,28(A5)
BSR ShowSampleInfo
BSR WaitForButtonUp
BSR RestorePtrCol
BRA RedrawSample
upserro BSR RestorePtrCol
BRA OutOfMemErr
DownSample
BSR WaitForButtonUp
TST.W InsNum
BEQ NotSampleNull
LEA DownSampleText,A0
BSR AreYouSure
BNE Return2
BSR TurnOffVoices
BSR StorePtrCol
BSR SetWaitPtrCol
MOVE.L si_pointer(PC),D0
BEQ ErrorRestoreCol
MOVEQ #0,D0
MOVE.W SampleInfo(PC),D0
BEQ ErrorRestoreCol
LSL.L #1,D0
CMP.L #$FFFE,D0
BHI ErrorRestoreCol
LSL.L #1,D0
CMP.L #$FFFE,D0
BLS dnsskip
MOVE.L #$FFFE,D0
dnsskip MOVE.L D0,BufMemSize
MOVEQ #MEMF_CHIP,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,BufMemPtr
BEQ SamMemError
MOVE.L si_pointer(PC),A1
MOVE.L D0,A2
MOVE.L BufMemSize,D3
LSR.L #1,D3
SUBQ.L #1,D3
dnsloop MOVE.B (A1)+,D0
MOVE.B D0,(A2)+
MOVE.B D0,(A2)+
DBRA D3,dnsloop
BSR FreeSample
LEA SamplePtrs,A0
MOVE.W InsNum(PC),D0
LSL.W #2,D0
MOVE.L BufMemPtr,(A0,D0.W)
MOVE.L BufMemSize,124(A0,D0.W)
MOVE.W 22(A5),D0
LSL.W #1,D0
CMP.W #$7FFF,D0
BLS dnsok1
MOVE.W #$7FFF,D0
dnsok1 MOVE.W D0,22(A5)
MOVE.W 26(A5),D0
LSL.W #1,D0
CMP.W #$7FFF,D0
BLS dnsok2
MOVE.W #$7FFF,D0
dnsok2 MOVE.W D0,26(A5)
MOVE.W 28(A5),D0
CMP.W #1,D0
BEQ dnsok3
LSL.W #1,D0
CMP.W #$7FFF,D0
BLS dnsok3
MOVE.W #$7FFF,D0
dnsok3 MOVE.W D0,28(A5)
BSR ShowSampleInfo
BSR WaitForButtonUp
BSR RestorePtrCol
BRA RedrawSample
SamplePos dc.l 0
SampleVol dc.w 100
FlangePos dc.l 0
ModSpeed dc.b 0
HalfClipFlag dc.b 0
ModPos dc.l 0
ModOffset dc.l 0
BufMemPtr dc.l 0
BufMemSize dc.l 0
;---- Save Song ----
SaveSong
BSR StopIt
CLR.B RawKeyCode
MOVE.L SongDataPtr(PC),A0
LEA SampleLengthAdd(PC),A1
MOVEQ #0,D0
MOVEQ #2,D1
sadloop MOVE.W (A1,D1.W),D2
ADD.W D2,42(A0,D0.W)
ADD.W #30,D0
ADDQ.W #2,D1
CMP.W #62,D1
BNE sadloop
LEA sd_pattpos(A0),A0
MOVEQ #0,D0
MOVEQ #0,D1
MOVEQ #0,D2
CLR.W HighPattNum
ssloop MOVE.B 0(A0,D0.W),D1
ADDQ.W #1,D0
CMP.W #128,D0
BHI DoSaveSong
MOVE.W HighPattNum(PC),D2
CMP.W D2,D1
BLS ssloop
MOVE.W D1,HighPattNum
BRA ssloop
DoSaveSong
LEA SongsPath2,A0
JSR CopyPath
MOVE.L SongDataPtr(PC),A0
MOVEQ #19,D0
dssloop MOVE.B (A0)+,(A1)+
DBRA D0,dssloop
MOVE.L #FileName,FileNamePtr
MOVE.L SongDataPtr(PC),DiskDataPtr
MOVE.L #1084,DiskDataLength
MOVEQ #0,D0
MOVE.W HighPattNum,D0
ADDQ.L #1,D0
LSL.L #8,D0
LSL.L #2,D0
ADD.L D0,DiskDataLength
MOVE.B PackMode,D0
BTST #0,D0
BEQ dssnocr
LEA CrunchingText(PC),A0
BSR ShowStatusText
BSR Cruncher
dssnocr BSR DoSaveData
MOVE.B PackMode,D0
BTST #0,D0
BEQ dssnoc2
LEA DecrunchingText(PC),A0
BSR ShowStatusText
BSR Decruncher
dssnoc2 MOVE.L SongDataPtr(PC),A0
LEA SampleLengthAdd(PC),A1
MOVEQ #0,D0
MOVEQ #2,D1
ssuloop MOVE.W (A1,D1.W),D2
SUB.W D2,42(A0,D0.W)
ADD.W #30,D0
ADD.W #2,D1
CMP.W #62,D1
BNE ssuloop
BSR ShowAllRight
BRA SetNormalPtrCol
Cruncher
BSR SetNormalPtrCol
MOVE.L SongDataPtr(PC),A0
MOVE.L A0,A1
LEA 12(A1),A1
MOVE.L A1,SongPlus12Ptr
MOVE.L A0,A1
ADD.L #70716,A1 ; hoeh...
MOVE.L A1,SongPlus70kPtr
MOVE.L A0,A1
ADD.L #70716,A1
SUB.L DiskDataLength(PC),A1
MOVE.L A1,EndOfSongPtr
MOVE.L DiskDataLength(PC),RealSongLength
MOVE.L SongDataPtr(PC),A0
ADD.L DiskDataLength(PC),A0
MOVE.L SongDataPtr(PC),A1
ADD.L #70716,A1
MOVE.L DiskDataLength(PC),D0
cloop MOVE.B -(A0),-(A1)
SUBQ.L #1,D0
BNE cloop
BSR DoCrunch
SUB.L SongPlus12Ptr(PC),A2
MOVE.L A2,D0
MOVE.L D0,CrunchedSongLength
MOVE.L D0,D1
ADD.L SongPlus12Ptr(PC),D1
MOVE.L D1,DontKnowWhat
MOVE.L SongDataPtr(PC),A0
MOVE.L #'PACK',(A0)
MOVE.L CrunchedSongLength,4(A0)
MOVE.L RealSongLength(PC),8(A0)
MOVE.L SongDataPtr(PC),DiskDataPtr
MOVE.L CrunchedSongLength(PC),D0
ADD.L #12,D0
MOVE.L D0,DiskDataLength
RTS
EndOfSongPtr dc.l 0
SongPlus70kPtr dc.l 0
RealSongLength dc.l 0
SongPlus12Ptr dc.l 0
DontKnowWhat dc.l 0
CrunchedSongLength dc.l 0
DoCrunch
MOVE.L EndOfSongPtr(PC),A0
MOVE.L SongPlus70kPtr(PC),A1
MOVE.L SongPlus12Ptr(PC),A2
MOVEQ #1,D2
CLR.W D1
dcloop BSR DoCrunch2
TST.B D0
BEQ dcskip
ADDQ.W #1,D1
CMP.W #$0108,D1
BNE dcskip
BSR DoCrunch6
dcskip CMP.L A0,A1
BGT dcloop
BSR DoCrunch6
BRA DoCrunch8
DoCrunch2
MOVE.L A0,A3
LEA 127(A3),A3
CMP.L A1,A3
BLE dc2skip
MOVE.L A1,A3
dc2skip MOVEQ #1,D5
MOVE.L A0,A5
ADDQ.L #1,A5
dc2_1 MOVE.B (A0),D3
MOVE.B 1(A0),D4
MOVE.W D3,$DFF1A2
dc2loop CMP.B (A5)+,D3
BNE dc2skip2
CMP.B (A5),D4
BEQ DoCrunch3
dc2skip2
CMP.L A5,A3
BGT dc2loop
BRA dc4_3
DoCrunch3
SUBQ.L #1,A5
MOVE.L A0,A4
dc3loop MOVE.B (A4)+,D3
CMP.B (A5)+,D3
BNE dc3skip
CMP.L A5,A3
BGT dc3loop
dc3skip MOVE.L A4,D3
SUB.L A0,D3
SUBQ.L #1,D3
CMP.L D3,D5
BGE dc4_2
MOVE.L A5,D4
SUB.L A0,D4
SUB.L D3,D4
SUBQ.L #1,D4
CMP.L #4,D3
BLE DoCrunch4
MOVEQ #6,D6
CMP.L #$00000101,D3
BLT dc3skip2
MOVE.W #$0100,D3
dc3skip2
BRA dc4_1
DoCrunch4
MOVE.W D3,D6
SUBQ.W #2,D6
LSL.W #1,D6
dc4_1 LEA CrunchData3(PC),A6
CMP.W 0(A6,D6.W),D4
BGE dc4_2
MOVE.L D3,D5
MOVE.L D4,CrunchData1
MOVE.B D6,CrunchData2
dc4_2 CMP.L A5,A3
BGT dc2_1
dc4_3 CMP.L #1,D5
BEQ DoCrunch5
BSR DoCrunch6
MOVE.B CrunchData2(PC),D6
MOVE.L CrunchData1(PC),D3
MOVE.W 8(A6,D6.W),D0
BSR DoCrunch7
MOVE.W $0010(A6,D6.W),D0
BEQ dc4skip
MOVE.L D5,D3
SUBQ.W #1,D3
BSR DoCrunch7
dc4skip MOVE.W $0018(A6,D6.W),D0
MOVE.W $0020(A6,D6.W),D3
BSR DoCrunch7
ADDQ.W #1,$0028(A6,D6.W)
ADD.L D5,A0
CLR.B D0
RTS
DoCrunch5
MOVE.B (A0)+,D3
MOVEQ #8,D0
BSR DoCrunch7
MOVEQ #1,D0
RTS
CrunchData1 dc.l 0
CrunchData2 dc.b 0,0
CrunchData3 dc.w $0100,$0200,$0400,$1000,8,9,10,8
dc.w 0,0,0,8,2,3,3,3,1,4,5,6,0,0,0,0
CrunchData4 dc.w 0
CrunchData5 dc.w 0
DoCrunch6
TST.W D1
BEQ Return2
MOVE.W D1,D3
CLR.W D1
CMP.W #9,D3
BGE dc6_2
ADDQ.W #1,CrunchData4
SUBQ.W #1,D3
MOVEQ #5,D0
BRA DoCrunch7
dc6_2 ADDQ.W #1,CrunchData5
SUB.W #9,D3
OR.W #$0700,D3
MOVEQ #11,D0
DoCrunch7
SUBQ.W #1,D0
dc7loop LSR.L #1,D3
ROXL.L #1,D2
BCS dc8_2
DBRA D0,dc7loop
RTS
DoCrunch8
CLR.W D0
dc8_2 MOVE.L D2,(A2)+
MOVEQ #1,D2
DBRA D0,dc7loop
RTS
Decruncher
MOVE.L SongDataPtr(PC),A0
LEA 12(A0),A0
MOVE.L EndOfSongPtr(PC),A1
MOVE.L CrunchedSongLength(PC),D0
MOVE.L RealSongLength(PC),D1
BSR DoDecrunch
MOVE.L EndOfSongPtr(PC),A0
MOVE.L SongDataPtr(PC),A1
MOVE.L RealSongLength(PC),D0
ddcloop MOVE.B (A0)+,(A1)+
SUBQ.L #1,D0
BNE ddcloop
MOVE.L SongDataPtr(PC),A0
ADD.L #$0001143C,A0
MOVE.L SongDataPtr(PC),A1
ADD.L RealSongLength(PC),A1
SUB.L A1,A0
MOVE.L A0,D0
ddcloop2
CLR.B (A1)+
SUBQ.L #1,D0
BNE ddcloop2
RTS
DoDecrunch
ADD.L D0,A0
MOVE.L D1,A2
ADD.L A1,A2
MOVE.L -(A0),D0
dec_1 LSR.L #1,D0
BNE.S decskip
BSR.S dec5
decskip BCS.S dec3
MOVEQ #8,D1
MOVEQ #1,D3
LSR.L #1,D0
BNE.S decskip2
BSR.S dec5
decskip2
BCS.S dec4_1
MOVEQ #3,D1
CLR.W D4
dec_2 BSR.S dec6
MOVE.W D2,D3
ADD.W D4,D3
decloop1
MOVEQ #7,D1
decloop2
LSR.L #1,D0
BNE.S decskip3
BSR.S dec5
decskip3
ROXL.L #1,D2
DBRA D1,decloop2
MOVE.B D2,-(A2)
DBRA D3,decloop1
BRA.S dec4_3
dec2 MOVEQ #8,D1
MOVEQ #8,D4
BRA.S dec_2
dec3 MOVEQ #2,D1
BSR.S dec6
CMP.B #2,D2
BLT.S dec4
CMP.B #3,D2
BEQ.S dec2
MOVEQ #8,D1
BSR.S dec6
MOVE.W D2,D3
MOVE.W #8,D1
BRA.S dec4_1
dec4 MOVE.W #9,D1
ADD.W D2,D1
ADDQ.W #2,D2
MOVE.W D2,D3
dec4_1 BSR.S dec6
dec4_2 SUBQ.W #1,A2
MOVE.B 0(A2,D2.W),(A2)
DBRA D3,dec4_2
dec4_3 CMP.L A2,A1
BLT.S dec_1
RTS
dec5 MOVE.L -(A0),D0
MOVE.W D0,$DFF1A2
MOVE #$10,CCR
ROXR.L #1,D0
RTS
dec6 SUBQ.W #1,D1
CLR.W D2
dec6loop
LSR.L #1,D0
BNE.S dec6skip
MOVE.L -(A0),D0
MOVE.W D0,$DFF1A2
MOVE #$10,CCR
ROXR.L #1,D0
dec6skip
ROXL.L #1,D2
DBRA D1,dec6loop
RTS
LoadModule
MOVE.W #1,LoadInProgress
BSR DoClearSong
BSR ClrSampleInfo
JSR SetDiskPtrCol
LEA ModulesPath2,A0
JSR CopyPath
LEA DirInputName,A0
MOVEQ #DirNameLength-1,D0
lmloop2 MOVE.B (A0)+,(A1)+
DBRA D0,lmloop2
LEA LoadingModuleText(PC),A0
BSR ShowStatusText
MOVE.L DOSbase(PC),A6
MOVE.L #FileName,D1
MOVE.L #1005,D2
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BEQ CantOpenFile
MOVE.L D0,D1
MOVE.L SongDataPtr(PC),D2
MOVE.L #1084,D3
JSR LVORead(A6)
MOVE.L SongDataPtr(PC),A0
CMP.L #'PP20',(A0)
BEQ PowerPacked
MOVE.B #127,sd_numofpatt+1(A0) ; Set maxpatt to 127
CMP.L #'M.K.',sd_mahokakt(A0) ; M.K. again...
BEQ lmskip
BSR MahoneyAndKaktus
BNE lmskip
MOVE.L FileHandle(PC),D1
MOVE.L #600,D2
MOVEQ #-1,D3
JSR LVOSeek(A6)
lmskip LEA LoadingModuleText(PC),A0
BSR ShowStatusText
MOVE.L SongDataPtr(PC),A0
LEA sd_pattpos(A0),A0
MOVEQ #0,D0
MOVE.B -1(A0),D0
MOVEQ #0,D3
lmloop3 CMP.B (A0)+,D3
BHI lmskip2
MOVE.B -1(A0),D3
lmskip2 DBRA D0,lmloop3
ADDQ.W #1,D3
MULU #1024,D3
MOVE.L FileHandle(PC),D1
MOVE.L SongDataPtr(PC),D2
ADD.L #1084,D2
MOVE.L DOSBase,A6
JSR LVORead(A6)
CLR.L PatternNumber
CLR.L CurrPos
BSR RedrawPattern
CLR.W ScrPattPos
BSR SetScrPatternPos
MOVE.W #1,InsNum
BSR CheckAbort
BEQ rmiend
TST.B AutoExitFlag
BEQ readinstrloop
JSR ExitFromDir
readinstrloop
TST.B NosamplesFlag
BNE rmiend
BSR CheckAbort
BEQ rmiend
BSR ShowSampleInfo
MOVE.W InsNum(PC),TuneUp
JSR DoShowFreeMem
MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D7
MULU #30,D7
MOVEQ #0,D0
MOVE.W 12(A0,D7.W),D0
BEQ rminext
ADD.L D0,D0
MOVE.L 4.W,A6
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
MOVE.L D0,-(SP)
JSR LVOAllocMem(A6)
MOVE.L (SP)+,D6
TST.L D0
BNE ReadModInstrument
BSR OutOfMemErr
MOVE.L DOSbase(PC),A6
MOVE.L FileHandle(PC),D1
MOVE.L D6,D2
MOVEQ #0,D3
BRA rminext
ReadModInstrument
MOVE.W InsNum(PC),D7
LSL.W #2,D7
LEA SamplePtrs(PC),A0
MOVE.L D0,0(A0,D7.W)
MOVE.L D6,124(A0,D7.W)
MOVE.L DOSbase(PC),A6
MOVE.L FileHandle(PC),D1
MOVE.L D0,D2
MOVE.L D6,D3
JSR LVORead(A6)
BSR RedrawSample
rminext ADDQ.W #1,InsNum
CMP.W #32,InsNum
BNE readinstrloop
rmiend MOVE.L FileHandle(PC),D1
MOVE.L DOSbase(PC),A6
JSR LVOClose(A6)
MOVE.W #1,InsNum
MOVE.L #6,CurrSpeed
CLR.W LoadInProgress
BSR ShowAllRight
JSR SetNormalPtrCol
BSR CheckInstrLengths
BSR ShowSampleInfo
BSR RedrawSample
JMP DoShowFreeMem
PowerPacked
LEA PowerPackedText,A0
BSR ShowStatusText
JSR SetErrorPtrCol
BSR DoClearSong
BSR ClrSampleInfo
BRA rmiend
PowerPackedText dc.b "Powerpacker mod.!",0
SaveModule
JSR StorePtrCol
JSR SetDiskPtrCol
MOVE.L SongDataPtr(PC),A0
LEA sd_pattpos(A0),A0
MOVEQ #0,D0
MOVEQ #0,D1
MOVEQ #0,D2
CLR.W HighPattNum
smloop MOVE.B 0(A0,D0.W),D1
ADDQ.W #1,D0
CMP.W #128,D0
BHI DoSaveModule
MOVE.W HighPattNum(PC),D2
CMP.W D2,D1
BLS smloop
MOVE.W D1,HighPattNum
BRA smloop
DoSaveModule
LEA ModulesPath2,A0
JSR CopyPath
MOVE.B #'m',(A1)+
MOVE.B #'o',(A1)+
MOVE.B #'d',(A1)+
MOVE.B #'.',(A1)+
MOVE.L SongDataPtr(PC),A0
MOVEQ #19,D0
dsmloop2
MOVE.B (A0)+,(A1)+
DBRA D0,dsmloop2
MOVE.L SongDataPtr(PC),A0
MOVE.L A0,DiskDataPtr
MOVE.L #1084,DiskDataLength
MOVEQ #0,D0
MOVE.W HighPattNum(PC),D0
ADDQ.L #1,D0
LSL.L #8,D0
LSL.L #2,D0
ADD.L D0,DiskDataLength ; Add 1024 x NumOfPatt
MOVE.B #127,sd_numofpatt+1(A0) ; Set maxpatt to 127
MOVE.L #'M.K.',sd_mahokakt(A0) ; M.K. again...
LEA SavingModuleText(PC),A0
BSR ShowStatusText
BTST #2,$DFF016
BEQ CantOpenFile
BSR OpenModForWrite
BNE CantOpenFile
BSR WriteModuleData
BNE WriteModError
BTST #2,$DFF016
BEQ WriteModError
MOVE.W InsNum(PC),SaveInstrNum
MOVEQ #1,D6
saveinstrloop
MOVE.W D6,InsNum
BSR ShowSampleInfo
BSR WriteInstrument
TST.L D0
BNE.S WriteModError
ADDQ.B #1,D6
CMP.B #32,D6
BNE saveinstrloop
BSR CloseWriteMod
MOVE.W SaveInstrNum(PC),InsNum
BSR ShowSampleInfo
BSR ShowAllRight
JMP RestorePtrCol
SaveInstrNum dc.w 0
WriteModError
BSR CloseWriteMod
BRA CantSaveFile
WriteInstrument
MOVE.W D6,D0
LSL.W #2,D0
LEA SamplePtrs(PC),A0
MOVE.L 0(A0,D0.W),D1
BEQ Return2
MOVE.L 124(A0,D0.W),D0
BEQ Return2
MOVE.L D1,DiskDataPtr
MOVE.L SongDataPtr(PC),A0
LEA 12(A0),A0
MOVE.W D6,D0
MULU #30,D0
ADD.L D0,A0
MOVEQ #0,D0
MOVE.W (A0),D0
LSL.L #1,D0
MOVE.L D0,DiskDataLength
BNE.S WriteModuleData
RTS
OpenModForWrite
MOVE.L DOSbase(PC),A6
MOVE.L #FileName,D1
MOVE.L #1006,D2
JSR LVOOpen(A6)
MOVE.L D0,D7
BEQ.S wmfailed
MOVEQ #0,D0
RTS
WriteModuleData
MOVE.L DOSbase(PC),A6
MOVE.L D7,D1
MOVE.L DiskDataPtr(PC),D2
MOVE.L DiskDataLength(PC),D3
BEQ .okok
JSR LVOWrite(A6)
CMP.L DiskDataLength(PC),D3
BNE.S wmfailed
; JSR LVOIoErr(A6)
; TST.L D0
; BNE.S wmfailed
MOVEQ #0,D0
.okok RTS
wmfailed
MOVEQ #-1,D0
RTS
CloseWriteMod
MOVE.L DOSbase(PC),A6
MOVE.L D7,D1
JMP LVOClose(A6)
;---- Load PLST ----
LoadPLST
LEA LoadPLSTText,A0
JSR AreYouSure
BNE Return2
JSR WaitForButtonUp
LEA LoadingPLSTText(PC),A0
BSR ShowStatusText
DoLoadPLST
JSR StorePtrCol
LEA PTPath,A0
JSR CopyPath
LEA PLSTName(PC),A0
MOVEQ #4,D0
dlploop MOVE.B (A0)+,(A1)+
DBRA D0,dlploop
MOVE.L #FileName,D1
MOVE.L #1005,D2
MOVE.L DOSbase(PC),A6
JSR LVOOpen(A6)
MOVE.L D0,D7
BEQ PLSTOpenErr
JSR SetDiskPtrCol
CLR.L PresetTotal
BSR.S AllocPLST
MOVE.L PLSTmem(PC),D2
BEQ PLSTMemErr2
MOVE.L D7,D1
MOVE.L PLSTallocsize,D3
MOVE.L DOSBase(PC),A6
JSR LVORead(A6)
MOVE.L D0,MaxPLSTOffset
DIVU #30,D0
MOVE.W D0,PresetTotal
cloplst MOVE.L D7,D1
MOVE.L DOSbase(PC),A6
JSR LVOClose(A6)
; BSR PLSTCheckNum
; BSR ShowAllRight
JMP RestorePtrCol
PLSTname dc.b 'PLST',0,0
AllocPLST
BSR.S FreePLST
MOVE.W MaxPLSTEntries,D0
BEQ Return2
MULU #30,D0
MOVE.L D0,PLSTAllocSize
MOVE.L #MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,PLSTmem
MOVE.W MaxPLSTEntries,MaxPLSTEntries2
RTS
FreePLST
CLR.W MaxPLSTEntries2
CLR.L MaxPLSTOffset
CLR.W PresetTotal
MOVE.L PLSTmem,D0
BEQ Return2
MOVE.L D0,A1
MOVE.L PLSTAllocSize,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
CLR.L PLSTmem
RTS
PLSTMemErr2
BSR.S PLSTMemErr
BRA cloplst
PLSTMemErr
TST.W MaxPLSTEntries
BEQ.S reptrco
BSET #0,InitError
LEA PLSTMemText,A0
plster BSR.S ShowStatusText
MOVE.W #50,WaitTime
JMP ErrorRestoreCol
reptrco JMP RestorePtrCol
PLSTOpenErr
TST.W MaxPLSTEntries
BEQ.S reptrco
BSET #1,InitError
LEA PLSTOpenText,A0
BRA.S plster
PLSTMemText dc.b 'no mem for plst !',0
PLSTOpenText dc.b 'plst not found ! ',0
InitError dc.b 0,0
ShowAllRight
MOVEM.L D0-D7/A0-A6,-(SP)
LEA AllRightText(PC),A0
BSR.S ShowStatusText
MOVEM.L (SP)+,D0-D7/A0-A6
RTS
ShowStatusText
MOVE.L TextBplPtr(PC),A1
ADD.L #5131,A1
MOVEQ #4,D0
stloop1 MOVEQ #16,D1
stloop2 CLR.B (A1)+
DBRA D1,stloop2
LEA 23(A1),A1
DBRA D0,stloop1
MOVE.L A0,A1
MOVE.W #5131,D1
MOVEQ #-1,D0
stloop3 ADDQ.W #1,D0
TST.B (A1)+
BNE.S stloop3
BRA ShowText3
;---- Redraw Pattern ----
RedrawPattern
TST.W SamScrEnable
BNE Return2
SF PattRfsh
MOVE.W #5121,TextOffset
MOVE.W PatternNumber+2(PC),WordNumber
BSR Print2DecDigits ; Print PatternNumber
MOVE.L SongDataPtr(PC),A6
LEA $043C(A6),A6
MOVE.L PatternNumber,D6
LSL.L #8,D6
LSL.L #2,D6
ADD.L D6,A6
MOVE.W #7521,TextOffset
CLR.L PPattPos
LEA PeriodTable(PC),A2
LEA RedrawBuffer(PC),A3
LEA FastHexTable(PC),A4
MOVEQ #'0',D4
MOVE.B BlankZeroFlag,D5
MOVEQ #63,D6
rpnxpos MOVEQ #3,D7
MOVE.W PPattPos+2(PC),WordNumber
BSR Print2DecDigits ; Print PatternPosition
ADDQ.W #1,TextOffset
ADDQ.L #1,PPattPos
rploop MOVEQ #0,D0
MOVEQ #0,D1
MOVE.W (A6),D1
AND.W #$0FFF,D1
BNE.S rpfind
MOVE.L #'--- ',(A3)
BRA.S rpskip
rpfind MOVEQ #36,D2
rpfindloop
CMP.W (A2,D0.W),D1
BEQ.S rpfound
ADDQ.L #2,D0
DBRA D2,rpfindloop
MOVE.L #'??? ',(A3)
BRA.S rpskip
rpfound LSL.L #1,D0
ADD.L NoteNamesPtr(PC),D0
MOVE.L D0,A0
MOVE.L (A0),(A3)
rpskip MOVE.B (A6)+,D0
LSR.B #4,D0
ADD.B #'0',D0
MOVE.B D0,3(A3)
MOVE.B (A6)+,D0
MOVEQ #0,D0
MOVE.B (A6)+,D0
ADD.W D0,D0
MOVE.W (A4,D0.W),4(A3)
MOVEQ #0,D0
MOVE.B (A6)+,D0
ADD.W D0,D0
MOVE.W (A4,D0.W),6(A3)
TST.B D5
BEQ.S rpskp3
CMP.B 3(A3),D4
BNE.S rpskp3
MOVE.B #' ',3(A3)
rpskp3 MOVE.W #9,TextLength
MOVE.L A3,ShowTextPtr
BSR ShowText
DBRA D7,rploop ; Next Channel
ADD.W #241,TextOffset
DBRA D6,rpnxpos ; Next PattPos
RTS
RedrawBuffer dc.b '---00000 ',0
ShowPosition
MOVE.L SongDataPtr(PC),A0
LEA 952(A0),A0
ADD.L CurrPos(PC),A0
MOVE.B (A0),WordNumber+1
MOVE.B (A0),PattRfshNum+3
MOVEQ #0,D1
MOVE.B (A0),D1
CMP.B LongFFFF+3(PC),D1
BEQ.S spskip2
ST PattRfsh
spskip2 MOVE.W #608,TextOffset
MOVE.B (A0),LongFFFF+3
CMP.W #0,CurrScreen
BEQ.S spokok
CMP.W #1,CurrScreen
BEQ.S spokok
CMP.W #6,CurrScreen
BEQ.S spokok
RTS
spokok BSR Print4DecDigits
MOVE.W CurrPos+2,WordNumber
MOVE.W #168,TextOffset
BRA Print4DecDigits
ShowSongLength
CMP.W #2,CurrScreen
BEQ.S ShowSongName
CMP.W #3,CurrScreen
BEQ.S ShowSongName
CMP.W #4,CurrScreen
BEQ Return2
CMP.W #5,CurrScreen
BEQ.S ShowSongName
MOVE.L SongDataPtr(PC),A0
LEA sd_numofpatt(A0),A0
MOVE.L A0,CurrCmds
CLR.W WordNumber
MOVE.B (A0),WordNumber+1
MOVE.W #1048,TextOffset
BSR Print4DecDigits
MOVE.L CurrCmds(PC),A0
ShowSongName
MOVE.L SongDataPtr(PC),A0
MOVE.W #4133,D1
MOVEQ #20,D0
BRA ShowText3
ShowSampleInfo
MOVEQ #0,D0
MOVE.W InsNum(PC),D0
MOVE.W D0,PlayInsNum
BNE.S ssiskipit
MOVE.W LastInsNum(PC),D0
ssiskipit
MOVE.W D0,D1
LSL.L #2,D0
LEA SamplePtrs(PC),A0
MOVE.L (A0,D0.W),si_pointer
MOVE.L SongDataPtr(PC),A0
LEA -10(A0),A0
MOVE.W D1,D0
MULU #30,D0
ADD.L D0,A0
MOVE.L A0,CurrCmds
MOVE.L 22(A0),SampleInfo
MOVE.L 26(A0),si_long
TST.B NoSampleInfo
BNE ssiskip
MOVE.L A0,-(SP)
MOVE.B #' ',FineTuneSign
MOVE.B 24(A0),D0
BEQ.S dopfitu
MOVE.B #'+',FineTuneSign
BTST #3,D0
BEQ.S dopfitu
MOVE.B #'-',FineTuneSign
MOVEQ #16,D1
SUB.B D0,D1
MOVE.B D1,D0
dopfitu MOVE.W #1491,TextOffset
BSR PrintHexDigit ; FineTune
LEA FineTuneSign(PC),A0
MOVE.W #1490,D1
MOVEQ #1,D0
BSR ShowText3 ; FineTuneSign
MOVE.L (SP)+,A0
CLR.W WordNumber
MOVE.B 25(A0),WordNumber+1
MOVE.W WordNumber,VolumeEfx
OR.W #$0C00,VolumeEfx
MOVE.W #2368,TextOffset
BSR PrintHexWord ; Volume
MOVEQ #0,D0
MOVE.W SampleInfo(PC),D0
LSL.L #1,D0
MOVE.W D0,WordNumber
MOVE.L SamplePos,D2
CMP.L D0,D2
BLS.S ShowLen
MOVE.L D0,SamplePos
BSR ShowPos
MOVEQ #0,D0
MOVE.W SampleInfo(PC),D0
LSL.L #1,D0
MOVE.W D0,WordNumber
ShowLen MOVE.W #2808,TextOffset
BSR PrintHexWord ; Length
MOVE.W si_long,D0
ADD.W D0,D0
MOVE.W D0,WordNumber
MOVE.W #3248,TextOffset
BSR PrintHexWord ; Repeat
MOVE.W si_long+2,D0
ADD.W D0,D0
MOVE.W D0,WordNumber
MOVE.W #3688,TextOffset
BSR PrintHexWord ; RepLen
BSR.S ssiinst
ssiskip TST.B NoSampleInfo
BEQ.S ssiskp2
CMP.W #5,CurrScreen
BEQ.S ssiskp2
CMP.W #3,CurrScreen
BNE Return2
ssiskp2 MOVE.L CurrCmds(PC),A0
MOVE.W #4573,D1
MOVEQ #22,D0
BRA ShowText3 ; SampleName
ssiinst TST.B NoSampleInfo
BNE Return2
MOVE.W InsNum(PC),WordNumber
MOVE.W #1928,TextOffset
BRA PrintHexWord ; SampleNumber
FineTuneSign dc.b ' ',0
VolumeEfx dc.w 0
;---- Print Decimal Digits ----
Print2DecDigits
MOVE.W #2,TextLength
MOVEQ #0,D1
MOVE.W WordNumber(PC),D1
LEA NumberText(PC),A0
BRA.S pdig
Print3DecDigits
MOVE.W #3,TextLength
MOVEQ #0,D1
MOVE.W WordNumber(PC),D1
LEA NumberText(PC),A0
BRA.S pdig100
Print4DecDigits
MOVE.W #4,TextLength
MOVEQ #0,D1
MOVE.W WordNumber(PC),D1
LEA NumberText(PC),A0
DIVU #1000,D1
BSR.S DoOneDigit
pdig100 DIVU #100,D1
BSR.S DoOneDigit
pdig DIVU #10,D1
BSR.S DoOneDigit
BSR.S DoOneDigit
MOVE.L #NumberText,A0
BRA ShowText2
DoOneDigit
ADD.B #'0',D1
MOVE.B D1,(A0)+
CLR.W D1
SWAP D1
RTS
Print6DecDigits
LEA NumberText,A0
MOVE.L D0,D1
CMP.L #1000000,D1
BHS toobig
SWAP D1
CLR.W D1
SWAP D1
DIVU #10,D1
SWAP D1
ADD.B #'0',D1
MOVE.B D1,5(A0)
CMP.L #10,D0
BLO.S p6zero1
DIVU #100,D0
MOVE.L D0,D1
CLR.W D0
SWAP D0
DIVU #10,D0
ADD.B #'0',D0
MOVE.B D0,4(A0)
AND.L #$FFFF,D1
BEQ.S p6zero2
DIVU #10,D1
SWAP D1
ADD.B #'0',D1
MOVE.B D1,3(A0)
CLR.W D1
SWAP D1
TST.W D1
BEQ.S p6zero3
DIVU #10,D1
SWAP D1
ADD.B #'0',D1
MOVE.B D1,2(A0)
CLR.W D1
SWAP D1
TST.W D1
BEQ.S p6zero4
DIVU #10,D1
SWAP D1
ADD.B #'0',D1
MOVE.B D1,1(A0)
CLR.W D1
SWAP D1
TST.W D1
BEQ.S p6zero5
DIVU #10,D1
SWAP D1
ADD.B #'0',D1
MOVE.B D1,(A0)
BRA.S p6end
p6zero1 MOVE.B #' ',4(A0)
p6zero2 MOVE.B #' ',3(A0)
p6zero3 MOVE.B #' ',2(A0)
p6zero4 MOVE.B #' ',1(A0)
p6zero5 MOVE.B #' ',0(A0)
p6end MOVE.W #6,TextLength
BRA ShowText2
toobig MOVE.B #' ',D0
BSR.S toobig2
DIVU #1000,D0
MOVE.W D0,WordNumber
BSR Print4DecDigits
MOVE.B #'K',D0
toobig2 LEA NumberText(PC),A0
MOVE.B D0,(A0)
MOVE.W #1,TextLength
BRA ShowText2
NumberText dcb.b 6,0
;---- Print Hex Digits ----
PrintHiInstrNum
MOVEQ #0,D0
TST.W CurrentPlayNote
BEQ.S phin2
MOVE.W InsNum(PC),D0
LSR.W #4,D0
BNE.S PrintHexDigit
phin2 TST.B BlankZeroFlag
BEQ.S PrintHexDigit
LEA BlankInsText(PC),A0
BRA.S phd2
PrintHexDigit
AND.L #$0F,D0
ADD.L D0,D0
LEA FastHexTable+1(PC),A0
ADD.L D0,A0
phd2 MOVE.W #1,TextLength
BRA.S ShowText2
BlankInsText dc.b " ",0
PrintHexWord
LEA WordNumber(PC),A0
MOVEQ #0,D0
MOVE.B (A0),D0
LSL.L #1,D0
LEA FastHexTable(PC),A0
ADD.L D0,A0
MOVE.W #2,TextLength
BSR.S ShowText2
PrintHexByte
LEA WordNumber(PC),A0
MOVEQ #0,D0
MOVE.B 1(A0),D0
LSL.L #1,D0
MOVE.L #FastHexTable,A0
ADD.L D0,A0
MOVE.W #2,TextLength
BSR.S ShowText2
CLR.W WordNumber
RTS
;---- Text Output Routines ----
ShowText3
MOVE.W D0,TextLength
MOVE.W D1,TextOffset
ShowText2
MOVE.L A0,ShowTextPtr
ShowText
MOVEM.L A2-A4,-(SP)
LEA TextTable(PC),A3
LEA FontData,A4
MOVE.W TextLength(PC),D0
MOVE.L TextBplPtr(PC),A1
MOVE.W TextOffset(PC),D1
LEA (A1,D1.W),A1
ADD.W D0,TextOffset
MOVE.L ShowTextPtr(PC),A0
BRA.S dstlope
dstloop MOVEQ #0,D1
MOVE.B (A0)+,D1
BNE.S dstskip
MOVE.B ShowZeroFlag(PC),D1
dstskip MOVE.B (A3,D1.W),D1
LSL.W #3,D1
MOVE.L A4,A2
ADD.L D1,A2
MOVE.B (A2)+,(A1)+
MOVE.B (A2)+,40-1(A1)
MOVE.B (A2)+,80-1(A1)
MOVE.B (A2)+,120-1(A1)
MOVE.B (A2),160-1(A1)
dstlope DBRA D0,dstloop
MOVEM.L (SP)+,A2-A4
RTS
SpaceShowText
MOVE.W ShowZeroFlag(PC),-(SP)
MOVE.B #' ',ShowZeroFlag
BSR.S ShowText
MOVE.W (SP)+,ShowZeroFlag
RTS
ShowZeroFlag dc.b 95,0
TextTable
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 0
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dc.b 00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15 ; 32
dc.b 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
dc.b 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 ; 64
dc.b 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
dc.b 69,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 ; 96
dc.b 48,49,50,51,52,53,54,55,56,57,58,65,66,67,68,63
dc.b 69,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 128
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dc.b 0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 160
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 192
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 224
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;---- Set Sprite Position ----
SetSpritePos
ADD.W #$002C,D1
ADD.W D1,D2
ROL.W #7,D2
ASL.W #1,D2
BCC.S sppskip
OR.W #2,D2
sppskip ROL.W #7,D1
ASL.W #1,D1
BCC.S sppskip2
OR.W #4,D2
sppskip2
ADD.W #$007D,D0
ASR.W #1,D0
BCC.S sppskip3
OR.W #1,D2
sppskip3
OR.W D0,D1
MOVE.W D1,(A0)
MOVE.W D2,2(A0)
RTS
;---- DoLoad / DoSave Data ----
DoLoadData
TST.L DiskDataLength
BEQ.S dlsend
TST.L DiskDataPtr
BEQ.S dlsend
JSR SetDiskPtrCol
LEA LoadingText(PC),A0
BSR ShowStatusText
MOVE.L DOSbase(PC),A6
MOVE.L FileNamePtr(PC),D1
MOVE.L #1005,D2
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BEQ.S CantOpenFile
MOVE.L FileHandle(PC),D1
MOVE.L DiskDataPtr(PC),D2
MOVE.L DiskDataLength(PC),D3
JSR LVORead(A6)
MOVE.L FileHandle(PC),D1
JSR LVOClose(A6)
dlsend CLR.L FileHandle
JSR SetNormalPtrCol
MOVEQ #-1,D0
RTS
CantOpenFile
LEA CantOpenFileText(PC),A0
caopfil BSR ShowStatusText
JSR SetErrorPtrCol
MOVEQ #0,D0
RTS
CantSaveFile
LEA CantSaveFileText(PC),A0
BRA.S caopfil
CantExamFile
LEA CantExamFileText(PC),A0
BRA.S caopfil
CantFindFile
LEA CantFindFileText(PC),A0
BRA.S caopfil
FileIsEmpty
LEA FileIsEmptyText(PC),A0
BRA.S caopfil
CantOpenFileText dc.b "can't open file !",0
CantSaveFileText dc.b "can't save file !",0
CantExamFileText dc.b "examine error !",0
CantFindFileText dc.b "can't find file !",0
FileIsEmptyText dc.b "file is empty !",0
DoSaveData
JSR SetDiskPtrCol
LEA SavingText(PC),A0
BSR ShowStatusText
MOVE.L DOSbase(PC),A6
MOVE.L FileNamePtr(PC),D1
MOVE.L #1006,D2
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BEQ CantOpenFile
MOVE.L FileHandle(PC),D1
MOVE.L DiskDataPtr(PC),D2
MOVE.L DiskDataLength(PC),D3
JSR LVOWrite(A6)
MOVE.L FileHandle(PC),D1
JSR LVOClose(A6)
CLR.L FileHandle
JMP SetNormalPtrCol
;---- PLST ----
PLST CLR.B RawKeyCode
CMP.W #6,CurrScreen
BEQ ExitPLST
CMP.W #1,CurrScreen
BNE Return2
JSR WaitForButtonUp
MOVE.W #6,CurrScreen
JSR ClearRightArea
JSR ClearAnalyzerColors
BSR.S DrawPLSTScreen
BEQ ExitPLST
BSR RedrawPLST
PLST_rts
RTS
DrawPLSTScreen
LEA PLSTData,A0
MOVE.L #PLSTSize,D0
BSR Decompact
BEQ Return2
LEA TopMenusPos,A0
MOVEQ #98,D0
dplstloop1
MOVEQ #24,D1
dplstloop2
MOVE.B 2574(A1),10240(A0)
MOVE.B (A1)+,(A0)+
DBRA D1,dplstloop2
LEA 15(A0),A0
ADDQ.L #1,A1
DBRA D0,dplstloop1
BSR FreeDecompMem
MOVEQ #-1,D0
RTS
ShowDiskNames
MOVE.W #616,TextOffset
MOVE.W #5,TextLength
MOVE.L #STText1,A0
BSR ShowText2
ADDQ.W #1,TextOffset
MOVE.L #STText2,A0
BSR ShowText2
ADDQ.W #1,TextOffset
MOVE.L #STText3,A0
BRA ShowText2
PLSTCheckNum
TST.L PLSTmem
BEQ NoPLST
TST.L MaxPLSTOffset
BEQ NoPLST
MOVE.L PLSTmem(PC),A0
MOVE.W PresetTotal(PC),D7
SUBQ.W #1,D7
TST.B STText1Number
BNE plstsskip
TST.B STText2Number
BNE plstsskip
TST.B STText3Number
BEQ PLSTMarkAll
plstsskip
MOVE.L STText1Number-1(PC),A3
MOVE.L STText2Number-1(PC),A4
MOVE.L STText3Number-1(PC),A5
MOVEQ #0,D6
PLSTmarkloop
MOVE.W #'st',(A0) ; Set lowercase 'st'
MOVE.B 3(A0),D0
CMP.B #'a',D0
BLO.S pmlskp1
SUB.B #32,D0
pmlskp1 MOVE.B D0,3(A0)
MOVE.B 4(A0),D0
CMP.B #'a',D0
BLO.S pmlskp2
SUB.B #32,D0
pmlskp2 MOVE.B D0,4(A0)
MOVE.L 2(A0),D0 ; Get number ('-01:' etc)
PLSTchk1
CMP.L A3,D0
BNE PLSTchk2
MOVE.W #'ST',(A0)
ADDQ.W #1,D6
BRA PLSTmarknext
PLSTchk2
CMP.L A4,D0
BNE PLSTchk3
MOVE.W #'ST',(A0)
ADDQ.W #1,D6
BRA PLSTmarknext
PLSTchk3
CMP.L A5,D0
BNE PLSTmarknext
MOVE.W #'ST',(A0)
ADDQ.W #1,D6
PLSTmarknext
ADD.L #30,A0
DBRA D7,PLSTmarkloop
MOVE.W D6,PresetMarkTotal
CLR.W PLSTpos
CLR.L PLSTOffset
RTS
PLSTMarkAll
MOVE.W #'ST',(A0) ; Set uppercase 'ST'
LEA 30(A0),A0
DBRA D7,PLSTMarkAll
MOVE.W PresetTotal(PC),PresetMarkTotal
CLR.W PLSTpos
CLR.L PLSTOffset
RTS
NoPLST CLR.W PresetMarkTotal
CLR.W PLSTpos
CLR.L PLSTOffset
RTS
RedrawPLST
MOVE.W PresetMarkTotal(PC),WordNumber
MOVE.W #189,TextOffset
BSR Print4DecDigits
BSR ShowDiskNames
TST.L PLSTmem
BEQ PLST_rts
TST.L MaxPLSTOffset
BEQ PLST_rts
MOVE.L PLSTOffset(PC),D6
MOVE.L PLSTmem(PC),A6
MOVE.W #976,A5 ; TextOffset
LEA PLSTOffset(PC),A4
MOVEQ #11,D7 ; Number of lines to print
TST.L D6
BMI EndOfPLST
dtplstloop
CMP.W #'ST',(A6,D6.L) ; Check for 'ST'
BNE PLSTNext
MOVE.L D6,(A4)+
MOVE.W A5,TextOffset
MOVE.W #19,TextLength
LEA (A6,D6.L),A3
ADDQ.L #3,A3
MOVE.L A3,ShowTextPtr
MOVEM.L D0-D7/A0-A6,-(SP)
BSR SpaceShowText
MOVEM.L (SP)+,D0-D7/A0-A6
MOVE.W 22(A6,D6.L),WordNumber
MOVE.W WordNumber,D0
LSL.W #1,D0
MOVE.W D0,WordNumber
MOVEM.L D0-D7/A0-A6,-(SP)
BSR PrintHexWord
MOVEM.L (SP)+,D0-D7/A0-A6
ADD.L #30,D6
CMP.L MaxPLSTOffset(PC),D6
BHI EndOfPLST
ADD.W #240,A5 ; Next Screen position
DBRA D7,dtplstloop
RTS
PLSTNext
ADD.L #30,D6
CMP.L MaxPLSTOffset(PC),D6
BHI EndOfPLST
BRA dtplstloop
EndOfPLST
MOVE.L #$FFFFFFFF,(A4)+
MOVE.W A5,TextOffset
MOVE.W #23,TextLength
MOVE.L #EmptyLineText,ShowTextPtr
MOVEM.L D0-D7/A0-A6,-(SP)
BSR SpaceShowText
MOVEM.L (SP)+,D0-D7/A0-A6
ADD.W #240,A5
DBRA D7,EndOfPLST
RTS
TypeInDisk1
LEA STText1Number(PC),A6
MOVE.W #156,LineCurX
BRA DoTypeInDisk
TypeInDisk2
LEA STText2Number(PC),A6
MOVE.W #204,LineCurX
BRA DoTypeInDisk
TypeInDisk3
LEA STText3Number(PC),A6
MOVE.W #252,LineCurX
DoTypeInDisk
CLR.B (A6)
CLR.B 1(A6)
JSR StorePtrCol
JSR SetWaitPtrCol
BSR ShowDiskNames
MOVE.W #20,LineCurY
BSR UpdateLineCurPos
BSR GetHexKey
TST.B RawKeyCode
BNE ClearDiskNum
BTST #2,$DFF016
BEQ ClearDiskNum
ADD.W D1,D1
LEA FastHexTable+1(PC),A0
MOVE.B (A0,D1.W),(A6)
ADDQ.W #8,LineCurX
BSR ShowDiskNames
BSR UpdateLineCurPos
BSR GetHexKey
TST.B RawKeyCode
BNE ClearDiskNum
BTST #2,$DFF016
BEQ ClearDiskNum
ADD.W D1,D1
LEA FastHexTable+1(PC),A0
MOVE.B (A0,D1.W),1(A6)
JSR RestorePtrCol
BSR PLSTCheckNum
BSR RedrawPLST
CLR.W LineCurX
MOVE.W #270,LineCurY
BRA UpdateLineCurPos
ClearAllDisks
BSR DoClearDisks
BSR PLSTCheckNum
BRA RedrawPLST
DoClearDisks
MOVEQ #0,D0
MOVE.B D0,STText1Number
MOVE.B D0,STText1Number+1
MOVE.B D0,STText2Number
MOVE.B D0,STText2Number+1
MOVE.B D0,STText3Number
MOVE.B D0,STText3Number+1
RTS
MountList
JSR StorePtrCol
JSR SetDiskPtrCol
BSR DoClearDisks
MOVE.W #1,MountFlag
LEA df0text(PC),A4
BSR DoMountList
LEA STText1(PC),A0
BSR CheckMountName
LEA df1text(PC),A4
BSR DoMountList
LEA STText2(PC),A0
BSR CheckMountName
LEA df2text(PC),A4
BSR DoMountList
LEA STText3(PC),A0
BSR CheckMountName
CLR.W MountFlag
JSR RestorePtrCol
BRA cdisknum2
DoMountList
CLR.L FIB_Filename
CLR.L FIB_Filename+4
CLR.L FIB_Filename+8
MOVE.L DOSBase(PC),A6
MOVE.L A4,D1
MOVEQ #-2,D2
JSR LVOLock(A6)
MOVE.L D0,FileLock
BEQ MountError
MOVE.L FileLock(PC),D1
MOVE.L #FileInfoBlock,D2
JSR LVOExamine(A6)
TST.L D0
BEQ MountError
MOVE.L FileLock(PC),D1
JSR LVOUnLock(A6)
MountError
MOVEQ #-1,D0
RTS
CheckMountName
MOVE.W FIB_Filename,D0
BEQ MountError
MOVE.W #'ST',D1 ; Check for ST
AND.W #$1F1F,D0
AND.W #$1F1F,D1
CMP.W D0,D1
BNE ClearDiskNum
MOVE.B FIB_Filename+3,D0
LSL.W #8,D0
MOVE.B FIB_Filename+4,D0
CMP.W #'00',D0
BEQ ClearDiskNum
MOVE.B D0,4(A0) ; Put disk number into ST-xx
LSR.W #8,D0
MOVE.B D0,3(A0)
MOVEQ #0,D0
RTS
ClearDiskNum
CLR.B RawKeyCode
JSR RestorePtrCol
CLR.B (A6)
CLR.B 1(A6)
CLR.W LineCurX
MOVE.W #270,LineCurY
BSR UpdateLineCurPos
cdisknum2
BSR PLSTCheckNum
BRA RedrawPLST
df0text dc.b 'DF0:',0,0
df1text dc.b 'DF1:',0,0
df2text dc.b 'DF2:',0,0
CheckPLSTGadgs
MOVEM.W MouseX2(PC),D0/D1
CMP.W #120,D0
BLO cplstend
CMP.W #23,D1
BHS PLSTPressed
CMP.W #12,D1
BHS PLSTLine2
PLSTLine1
CMP.W #268,D0
BHS ExitPLST
CMP.W #168,D0
BHS cplstend
CMP.W #120,D0
BHS ClearAllDisks
RTS
PLSTLine2
CMP.W #268,D0
BHS MountList
CMP.W #218,D0
BHS TypeInDisk3
CMP.W #168,D0
BHS TypeInDisk2
BRA TypeInDisk1
cplstend
RTS
ExitPLST
JSR WaitForButtonUp
CLR.B RawKeyCode
JSR ClearRightArea
JMP DisplayMainScreen
PLSTOneUp
TST.W PresetMarkTotal
BEQ Return2
BTST #6,$BFE001
BEQ PLST_rts
MOVE.W PLSTpos,D0
MOVE.W D0,D2
SUBQ.W #1,D0
TST.W ShiftKeyStatus
BNE.S pouski2
BTST #2,$DFF016
BNE pouskip
pouski2 SUB.W #9,D0
pouskip TST.W D0
BPL DoPLSTUpDown
CLR.W D0
BRA DoPLSTUpDown
PLSTOneDown
TST.W PresetMarkTotal
BEQ Return2
BTST #6,$BFE001
BEQ PLST_rts
MOVE.W PLSTpos(PC),D0
MOVE.W D0,D2
ADDQ.W #1,D0
TST.W ShiftKeyStatus
BNE.S podski2
BTST #2,$DFF016
BNE podskip
podski2 ADD.W #9,D0
podskip MOVE.W PresetMarkTotal(PC),D1
SUB.W #12,D1
CMP.W D0,D1
BHS DoPLSTUpDown
MOVE.W D1,D0
DoPLSTUpDown
BSR UpdateOffset
BRA RedrawPLST
UpdateOffset
MOVE.W PLSTpos(PC),D1
MOVE.W D0,PLSTpos
CMP.W D0,D1
BEQ Return2
TST.W D0
BEQ ZeroPLSTOffset
SUBQ.W #1,D0
MOVE.L PLSTmem(PC),A0
MOVEQ #0,D6
cpoloop CMP.W #'ST',(A0,D6.L) ; Check for 'ST'
BEQ NextPLSTOffset
ADD.L #30,D6
BRA cpoloop
NextPLSTOffset
ADD.L #30,D6
DBRA D0,cpoloop
MOVE.L D6,PLSTOffset
RTS
ZeroPLSTOffset
CLR.L PLSTOffset
RTS
PLSTPressed
CMP.W #24,D1
BLO Return2
CMP.W #95,D1
BHI Return2
SUB.W #24,D1
AND.L #$0000FFFF,D1
DIVU #6,D1
LSL.W #2,D1
LEA PLSTOffset(PC),A0
MOVE.L (A0,D1.W),D1
BMI Return2
DIVU #30,D1
ADDQ.W #1,D1
MOVE.W D1,CurrentPreset
JSR WaitForButtonUp
BRA UsePreset
;---- Preset Editor/PED ----
PresetEditor
JSR WaitForButtonUp
MOVE.W #4,CurrScreen
ST DisableAnalyzer
ST NoSampleInfo
BSR SwapPresEdScreen
BEQ pedexi2
PED_Refresh
CLR.W PED_Action
MOVE.L TextBplPtr(PC),A0
MOVE.W #1219,D0
pedloop CLR.L (A0)+
DBRA D0,pedloop
JSR SetNormalPtrCol
JSR ClearAnalyzerColors
BSR ShowPEDnumbers
BRA ShowPresetNames
SwapPresEdScreen
MOVE.L DecompMemPtr,D0
BEQ speds2
MOVE.L D0,A1
BSR speds3
BRA FreeDecompMem
speds2 LEA PresetEdData,A0
MOVE.L #PresetEdSize,D0
BSR Decompact
BEQ Return2
speds3 LEA BitplaneData,A0
MOVEQ #1,D2
spesloop1
MOVE.W #1219,D0
spesloop2
MOVE.L (A0),D1
MOVE.L (A1),(A0)+
MOVE.L D1,(A1)+
DBRA D0,spesloop2
LEA $14F0(A0),A0
DBRA D2,spesloop1
MOVEQ #-1,D0
RTS
CheckPresEdGadgs
MOVEM.W MouseX2(PC),D0/D1
CMP.W #45,D1
BHS CheckPEDnames
CLR.W PED_Action
JSR SetNormalPtrCol
CMP.W #307,D0
BHS PED_GotoPLST
PED_Menu1
CMP.W #101,D0
BHS PED_Menu2
CMP.W #34,D1
BHS PED_DeleteDisk
CMP.W #23,D1
BHS PED_Delete
CMP.W #12,D1
BHS PED_Insert
BRA PED_AddPathGadg
PED_Menu2
CMP.W #209,D0
BHS PED_Menu3
CMP.W #34,D1
BHS PED_ClearPLST
CMP.W #23,D1
BHS Return2
CMP.W #12,D1
BHS PED_Disk
BRA PED_EnterPath
PED_Menu3
CMP.W #34,D1
BHS PED_Print
CMP.W #23,D1
BHS WritePLST
CMP.W #12,D1
BHS.S xLoadPLST
BRA PED_EnterPath
xLoadPLST
BSR LoadPLST
MOVE.W #1,PEDPos
BRA PED_Refresh
PED_GotoPLST
BSR PED_Exit
BRA PLST
PED_Exit
JSR WaitForButtonUp
BSR PLSTCheckNum
BSR SwapPresEdScreen
MOVE.L TextBplPtr(PC),A0
MOVE.W #1219,D0
pedeloop CLR.L (A0)+
DBRA D0,pedeloop
CLR.B RawKeyCode
pedexi2 JSR ClearAnalyzerColors
JMP DisplayMainAll
PED_AddPathGadg
TST.L PLSTmem
BNE pedawok
BSR AllocPLST
TST.L PLSTmem
BEQ PLSTMemErr
pedawok MOVE.L DOSbase(PC),A6
MOVE.L #PEdDefaultPath,D1
MOVEQ #-2,D2
JSR LVOLock(A6)
MOVE.L D0,FileLock
BEQ UnlockReadPath
JSR SetDiskPtrCol
LEA AddingPathText(PC),A0
BSR ShowStatusText
MOVE.L DOSbase(PC),A6
MOVE.L FileLock(PC),D1
MOVE.L #FileInfoBlock,D2
JSR LVOExamine(A6)
TST.L D0
BPL UnlockReadPath
TST.L FIB_EntryType
BPL CheckPathDirName
BSR AddPreset
BRA IsPLSTfull
CheckPathDirName
CMP.B #'-',FIB_FileName+2
BNE IsPLSTfull
MOVE.B FIB_FileName+3,SndDiskNum0
MOVE.B FIB_FileName+4,SndDiskNum1
BSR ShowPEDnumbers
IsPLSTfull
MOVE.W PresetTotal(PC),D0
CMP.W MaxPLSTEntries,D0
BLO ReadPathNext
BSR PLSTisFull
BRA ReadPathEnd
ReadPathNext
MOVE.L DOSbase,A6
MOVE.L FileLock(PC),D1
MOVE.L #FileInfoBlock,D2
JSR LVOExNext(A6)
TST.L D0
BPL ReadPathEnd
BTST #2,$DFF016
BEQ ReadPathEnd
TST.L FIB_EntryType
BPL IsPLSTfull
CMP.L #'.inf',FIB_FileName
BEQ IsPLSTfull
CMP.L #'.inf',FIB_FileName+4
BEQ IsPLSTfull
; LEA FIB_FileName,A0
; MOVEQ #28,D0
;repalop CMP.B #'.',(A0)+
; BEQ CouldBeInfo
; DBRA D0,repalop
rpnskip CLR.W PresetRepeat
MOVE.W #1,PresetReplen
; TST.B IFFLoopFlag ; name is ok, test for IFF
BRA rpnskp2
; LEA PEDDefaultPath,A0
JSR CopyPath
LEA FIB_FileName,A0
rpncpfn MOVE.B (A0)+,(A1)+
BNE.S rpncpfn
MOVE.L #FileName,D1
MOVE.L #1005,D2
MOVE.L DOSbase(PC),A6
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BEQ.S rpnskp2
MOVE.L D0,D1
LEA chkiffbuffer(PC),A2
CLR.L (A2)
MOVE.L A2,D2
MOVEQ #12,D3
JSR LVORead(A6)
CMP.L #"FORM",(A2)
BNE.S rpnclse
CMP.L #"8SVX",8(A2)
BNE.S rpnclse
rpnvhdr MOVE.L FileHandle(PC),D1
MOVE.L A2,D2
MOVEQ #4,D3
JSR LVORead(A6)
TST.L D0
BEQ.S rpnclse
CMP.L #"VHDR",(A2)
BNE.S rpnvhdr
MOVE.L FileHandle(PC),D1
MOVE.L A2,D2
MOVEQ #12,D3
JSR LVORead(A6)
MOVE.L 8(A2),D0
BEQ.S rpnclse
LSR.W #1,D0
MOVE.W D0,PresetReplen
MOVE.L 4(A2),D0
LSR.W #1,D0
MOVE.W D0,PresetRepeat
rpnclse MOVE.L FileHandle(PC),D1
JSR LVOClose(A6)
rpnskp2 BSR AddPreset
BSR ShowPEDnumbers
BRA IsPLSTfull
chkiffbuffer
dc.l 0,0,0
CouldBeInfo
CMP.B #'i',(A0)+
BNE rpnskip
CMP.B #'n',(A0)+
BNE rpnskip
CMP.B #'f',(A0)+
BNE rpnskip
CMP.B #'o',(A0)+
BNE rpnskip
CMP.B #0,(A0)+
BNE rpnskip
BRA IsPLSTFull
ReadPathEnd
MOVE.L DOSbase(PC),A6
MOVE.L FileLock(PC),D1
BEQ rpeskip
JSR LVOUnLock(A6)
rpeskip JSR SetNormalPtrCol
BSR ShowPresetNames
BRA ShowAllRight
UnlockReadPath
MOVE.L DOSbase(PC),A6
MOVE.L FileLock(PC),D1
BEQ urpend
JSR LVOUnLock(A6)
urpend JMP SetErrorPtrCol
AddPreset
LEA PEdDefaultVol(PC),A0
LEA PresetName(PC),A1
MOVEQ #21,D0
.loop CLR.B (A1)+
DBRA D0,.loop
LEA PresetName(PC),A1
MOVEQ #5,D0 ; Disk ST-XX:
aploop MOVE.B (A0)+,(A1)+
DBRA D0,aploop
LEA FIB_FileName,A0
MOVEQ #14,D0 ; Name 16 letters.
aploop2 MOVE.B (A0)+,D1
BEQ .skip
MOVE.B D1,(A1)+
DBRA D0,aploop2
.skip CLR.B (A1)
MOVE.L FIB_FileSize,D0
CMP.L #$FFFE,D0
BLS.S apskip2
MOVE.W #$FFFE,D0
apskip2 LSR.W #1,D0
MOVE.W D0,PresetLength
CLR.W PresetFineTune
LEA PresetName(PC),A6
BSR PED_CheckAdd
ADDQ.W #1,PresetTotal
ADD.L #30,MaxPLSTOffset
RTS
PED_Insert
TST.L PLSTmem
BNE pediwok
BSR AllocPLST
TST.L PLSTmem
BEQ PLSTMemErr
pediwok MOVE.W PresetTotal(PC),D0
CMP.W MaxPLSTEntries2,D0
BHS PLSTisFull
LEA InsertPsetText(PC),A0
LEA PresetName(PC),A1
MOVEQ #39,D0
pediloop
MOVE.B (A0)+,(A1)+
DBRA D0,pediloop
PossibleEdit
JSR StorePtrCol
JSR SetWaitPtrCol
MOVE.L TextBplPtr(PC),A0
LEA 2320(A0),A0
MOVEQ #59,D0
pediloop2
CLR.L (A0)+
DBRA D0,pediloop2
LEA EnterDataText(PC),A0
BSR ShowStatusText
MOVE.W #63,LineCurY
LEA PresetName(PC),A6
MOVEQ #3,D7
MOVE.B #4,EnterTextFlag
ShowPsetText
LEA PresetName+3(PC),A0
MOVEQ #37,D0
MOVE.W #2321,D1
BSR ShowText3
MOVE.W D7,D0
SUBQ.W #3,D0
ASL.W #3,D0
ADD.W #12,D0
MOVE.W D0,LineCurX
BSR UpdateLineCurPos
pediwaitkey
JSR DoKeyBuffer
MOVE.B RawKeyCode(PC),D0
BEQ pediwaitkey
CLR.B RawKeyCode
BTST #7,D0
BNE pediwaitkey
AND.W #$FF,D0
CMP.B #69,D0
BEQ PED_ESCkey
CMP.B #65,D0
BEQ PED_BkspaceKey
CMP.B #68,D0
BEQ PED_ReturnKey
CMP.B #79,D0
BEQ PED_LeftArrowKey
CMP.B #78,D0
BEQ PED_RightArrowKey
CMP.B #64,D0
BHI pediwaitkey
CMP.W #40,D7
BEQ pediwaitkey
CMP.W #22,D7
BEQ pediwaitkey
LEA UnshiftedKeymap(PC),A0
TST.W ShiftKeyStatus
BEQ ShiftKeySkip
LEA ShiftedKeymap(PC),A0
ShiftKeySkip
MOVE.B 0(A0,D0.W),D1
BEQ pediwaitkey
CMP.W #6,D7
BLO.S hexchk2
CMP.W #25,D7
BLO PED_PrintChar
hexchk2 CMP.B #'0',D1
BLO pediwaitkey
CMP.B #'f',D1
BHI pediwaitkey
CMP.B #'9',D1
BLS PED_PrintChar
CMP.B #'a',D1
BHS PED_PrintChar
BRA pediwaitkey
PED_PrintChar
MOVE.B D1,(A6,D7.W)
BRA PED_RightArrowKey
PED_ReturnKey
CMP.B #' ',PsetNameText
BEQ PED_ESCkey
LEA PsetVolText(PC),A0
LEA fitutexttab+32(PC),A1
MOVE.B (A0)+,D1
LSL.W #8,D1
MOVE.B (A0),D1
MOVEQ #15,D0
vofloop CMP.W -(A1),D1
BEQ.S vofound
DBRA D0,vofloop
MOVEQ #0,D0
vofound MOVE.W D0,PresetFineTune
LEA PsetLenText(PC),A0
BSR HexToInteger
LSR.W #1,D0
MOVE.W D0,PresetLength
LEA PsetRepeatText(PC),A0
BSR HexToInteger
LSR.W #1,D0
MOVE.W D0,PresetRepeat
LEA PsetReplenText(PC),A0
BSR HexToInteger
LSR.W #1,D0
MOVE.W D0,PresetReplen
BSR PED_CheckAdd
ADDQ.W #1,PresetTotal
PED_ESCkey
CLR.W LineCurX
MOVE.W #270,LineCurY
BSR UpdateLineCurPos
BSR ShowPresetNames
BSR ShowPEDnumbers
BSR ShowAllRight
CLR.B EnterTextFlag
JMP RestorePtrCol
PED_BkspaceKey
CMP.W #23,D7
BHS pedbsend
CMP.W #6,D7
BLS pedbsend
SUBQ.W #1,D7
MOVE.B #' ',(A6,D7.W)
pedbsend
BRA ShowPsetText
PED_LeftArrowKey
SUBQ.W #1,D7
CMP.W #2,D7
BLS pedlakskip2
CMP.W #5,D7
BEQ pedlakskip
CMP.W #22,D7
BEQ pedlakskip
CMP.W #25,D7
BEQ pedlakskip
CMP.W #30,D7
BEQ pedlakskip
CMP.W #35,D7
BEQ pedlakskip
BRA ShowPsetText
pedlakskip
SUBQ.W #1,D7
BRA ShowPsetText
pedlakskip2
MOVEQ #3,D7
BRA ShowPsetText
PED_RightArrowKey
ADDQ.W #1,D7
CMP.W #5,D7
BEQ pedrakskip
CMP.W #22,D7
BEQ pedrakskip
CMP.W #25,D7
BEQ pedrakskip
CMP.W #30,D7
BEQ pedrakskip
CMP.W #35,D7
BEQ pedrakskip
CMP.W #40,D7
BHS pedrakskip2
BRA ShowPsetText
pedrakskip
ADDQ.W #1,D7
BRA ShowPsetText
pedrakskip2
MOVEQ #39,D7
BRA ShowPsetText
PED_CheckAdd
MOVEQ #23,D0
pedcaloop
SUBQ.W #1,D0
CMP.B #' ',0(A6,D0.W)
BEQ pedcaloop
CLR.B 1(A6,D0.W)
MOVE.L PLSTmem(PC),A5
LEA 30(A5),A5
pedccnextloop
MOVEQ #6,D0
TST.B 6(A5)
BEQ PED_AddPreset
PED_ConvertLoop
MOVE.B 0(A5,D0.W),D2
BNE PED_ConvertCase
TST.B 0(A6,D0.W)
BNE PED_ConvertCase
CLR.B 6(A5)
SUBQ.W #1,PresetTotal
BRA PED_AddPreset
PED_ConvertCase
CMP.B #'A',D2
BLO pedccskip
CMP.B #'Z',D2
BHI pedccskip
ADD.B #32,D2
pedccskip
MOVE.B 0(A6,D0.W),D1
CMP.B #' ',D1
BEQ pedccskip3
CMP.B #'A',D1
BLO pedccskip2
CMP.B #'Z',D1
BHI pedccskip2
ADD.B #32,D1
pedccskip2
CMP.B D2,D1
BEQ pedccnext
BHI pedccskip3
BRA PED_AddPreset
pedccnext
ADDQ.W #1,D0
CMP.W #22,D0
BNE PED_ConvertLoop
pedccskip3
LEA 30(A5),A5
BRA pedccnextloop
PED_AddPreset
TST.B 6(A5)
BEQ pedapskip
MOVE.L PLSTmem(PC),A1
MOVE.W PresetTotal(PC),D0
CMP.W #1,D0
BEQ pedapskip
MULU #30,D0
ADD.L D0,A1
LEA 30(A1),A1
CLR.B 31(A1)
pedaploop
MOVE.W (A1),30(A1)
SUBQ.L #2,A1
CMP.L A1,A5
BLS pedaploop
pedapskip
MOVEQ #21,D0
pedaploop2
MOVE.B 0(A6,D0.W),D1
CMP.B #'A',D1
BLO pedapskip2
CMP.B #'Z',D1
BHI pedapskip2
ADD.B #32,D1
pedapskip2
CMP.B #' ',D1
BNE pedapskip3
MOVEQ #0,D1
pedapskip3
MOVE.B D1,0(A5,D0.W)
DBRA D0,pedaploop2
MOVE.W PresetLength(PC),22(A5)
MOVE.B PresetFineTune+1(PC),24(A5)
MOVE.B #$40,25(A5)
MOVE.W PresetRepeat(PC),26(A5)
MOVE.W PresetReplen(PC),28(A5)
RTS
HexToInteger
MOVEQ #0,D0
BSR Single_hti
LSL.W #8,D1
LSL.W #4,D1
OR.W D1,D0
BSR Single_hti
LSL.W #8,D1
OR.W D1,D0
HexToInteger2
BSR Single_hti
LSL.W #4,D1
OR.W D1,D0
BSR Single_hti
OR.W D1,D0
RTS
Single_hti
MOVEQ #0,D1
MOVE.B (A0)+,D1
CMP.B #$60,D1
BLO shtiskip
SUB.B #$20,D1
shtiskip
SUB.B #$30,D1
CMP.B #9,D1
BLS Return2
SUBQ.B #7,D1
RTS
PED_Delete
JSR SetDeletePtrCol
MOVE.W #1,PED_Action
LEA SelectEntryText(PC),A0
BRA ShowStatusText
PED_ClearPLST
LEA ClearPLSTText,A0
JSR AreYouSure
BNE Return2
BSR FreePLST
BRA PED_Refresh
ClearPLSTText dc.b 'clear plst ?',0,0
PED_Print
LEA PrintPLSTText,A0
JSR AreYouSure
BNE Return2
JSR StorePtrCol
MOVE.L DOSbase(PC),A6
MOVE.L #PrintPath,D1
MOVE.L #1006,D2
JSR LVOOpen(A6)
MOVE.L D0,FileHandle
BEQ CantOpenFile
JSR SetDiskPtrCol
MOVE.L D0,D1
MOVE.L #PsetPLSTtext,D2
MOVEQ #56,D3
JSR LVOWrite(A6)
LEA PrintingPLSTText(PC),A0
BSR ShowStatusText
CLR.W PsetNumTemp
pedpmainloop
MOVE.W PsetNumTemp(PC),D0
LEA PsetPrtNumText(PC),A0
BSR IntToDecASCII
MOVE.L PLSTmem(PC),A0
MOVE.W PsetNumTemp(PC),D0
MULU #30,D0
ADD.L D0,A0
MOVE.L A0,PsetPtrTemp
LEA PsetPrtNameText(PC),A1
MOVE.L A1,A2
MOVEQ #19,D1
FillSpaceLoop
MOVE.B #' ',(A2)+
DBRA D1,FillSpaceLoop
MOVEQ #19,D1
pedploop
TST.B (A0)
BEQ pedpskip
MOVE.B (A0)+,(A1)+
DBRA D1,pedploop
pedpskip
MOVE.L PsetPtrTemp(PC),A1
MOVE.W 22(A1),D0
LEA PsetPrtLenText(PC),A0
BSR IntToHexASCII
MOVE.L PsetPtrTemp(PC),A1
MOVE.W 26(A1),D0
LEA PsetPrtRepeatText(PC),A0
BSR IntToHexASCII
MOVE.L PsetPtrTemp(PC),A1
MOVE.W 28(A1),D0
ADD.W D0,D0
LEA PsetPrtRepLenText(PC),A0
BSR IntToHexASCII
MOVE.L FileHandle(PC),D1
MOVE.L #PsetPrtNumText,D2
MOVEQ #53,D3
JSR LVOWrite(A6)
BTST #2,$DFF016
BEQ AbortPLSTPrint
ADDQ.W #1,PsetNumTemp
MOVE.W PsetNumTemp(PC),D0
CMP.W PresetTotal(PC),D0
BNE pedpmainloop
BRA pedpend
AbortPLSTPrint
LEA OprAbortedText(PC),A0
BSR ShowStatusText
JSR SetErrorPtrCol
pedpend MOVE.L FileHandle(PC),D1
JSR LVOClose(A6)
BSR ShowAllRight
JMP RestorePtrCol
IntToDecASCII
MOVEQ #3,D3
MOVE.L #1000,D2
itdloop EXT.L D0
DIVU D2,D0
ADD.B #'0',D0
MOVE.B D0,(A0)+
DIVU #10,D2
SWAP D0
DBRA D3,itdloop
RTS
IntToHex2
MOVEQ #1,D2
BRA ithaloop
IntToHexASCII
MOVEQ #3,D2
ithaloop
MOVE.W D0,D1
AND.B #15,D1
CMP.B #10,D1
BLO ithaskip
ADDQ.B #7,D1
ithaskip
ADD.B #'0',D1
MOVE.B D1,-(A0)
ROR.W #4,D0
DBRA D2,ithaloop
RTS
WritePLST
LEA SavePLSTText,A0
JSR AreYouSure
BNE Return2
JSR StorePtrCol
JSR SetDiskPtrCol
LEA SavingPLSTText(PC),A0
BSR ShowStatusText
LEA PTPath,A0
JSR CopyPath
LEA PLSTName(PC),A0
MOVEQ #4,D0
dsploop MOVE.B (A0)+,(A1)+
DBRA D0,dsploop
MOVE.L #FileName,D1
MOVE.L #1006,D2
MOVE.L DOSbase(PC),A6
JSR LVOOpen(A6)
MOVE.L D0,D7
BEQ CantOpenFile
MOVE.L D0,D1
MOVE.L PLSTmem(PC),D2
MOVE.W PresetTotal(PC),D3
MULU #30,D3
JSR LVOWrite(A6)
MOVE.L D7,D1
JSR LVOClose(A6)
BSR ShowAllRight
JMP RestorePtrCol
CheckPEDnames
CMP.W #307,D0
BLO PED_PsetHit
CLR.W PED_Action
JSR SetNormalPtrCol
CMP.W #122,D1
BHS Return2
CMP.W #111,D1
BHS PED_Bottom
CMP.W #100,D1
BHS.S PED_OneDown
CMP.W #67,D1
BHS PED_Exit
CMP.W #56,D1
BHS.S PED_OneUp
BRA.S PED_Top
PED_OneUp
SUBQ.W #1,PEDpos
TST.W ShiftKeyStatus
BNE.S poup2
BTST #2,$DFF016
BNE.S pedouskip
poup2 SUBQ.W #7,PEDpos
pedouskip
CMP.W #1,PEDpos
BGE ShowPresetNames
PED_Top MOVE.W #1,PEDpos
BRA ShowPresetNames
PED_OneDown
CMP.W #9,PresetTotal
BLO ShowPresetNames
ADDQ.W #1,PEDpos
TST.W ShiftKeyStatus
BNE.S podn2
BTST #2,$DFF016
BNE.S pedodskip
podn2 ADDQ.W #7,PEDpos
pedodskip
MOVE.W PresetTotal,D0
SUB.W #10,D0
CMP.W PEDpos,D0
BHS ShowPresetNames
pedodsx MOVE.W D0,PEDpos
BRA ShowPresetNames
PED_Bottom
MOVE.W PresetTotal(PC),D0
SUB.W #11,D0
BMI.S PED_Top
ADDQ.W #1,D0
BRA.S pedodsx
ShowPresetNames
MOVE.W #2321,D6
MOVEQ #9,D7
MOVE.L PLSTmem(PC),D0
BEQ Return2
MOVE.L D0,A5
MOVE.W PEDpos(PC),D0
MULU #30,D0
ADD.L D0,A5
spndploop
TST.B (A5)
BEQ Return2
LEA PresetNameText,A1
MOVEQ #21,D0
spnloop MOVE.B #' ',(A1)+
DBRA D0,spnloop
MOVE.L A5,A0
ADDQ.L #3,A0
LEA -22(A1),A1
spnloop2
MOVE.B (A0)+,D0
BEQ.S DisplayPreset
MOVE.B D0,(A1)+
BRA.S spnloop2
fitutexttab
dc.b " 0+1+2+3+4+5+6+7-8-7-6-5-4-3-2-1"
DisplayPreset
MOVEQ #19,D0
LEA PresetNameText,A0
MOVE.W D6,D1
BSR ShowText3
ADD.W #20,D6
MOVE.W D6,TextOffset
MOVEQ #0,D0
MOVE.B 24(A5),D0
AND.B #$0F,D0
ADD.W D0,D0
LEA fitutexttab(PC,D0.W),A0
MOVE.W #2,TextLength
BSR ShowText2
MOVE.W 22(A5),D0
ADD.W D0,D0
MOVE.W D0,WordNumber
ADDQ.W #1,TextOffset
BSR PrintHexWord
MOVE.W 26(A5),D0
ADD.W D0,D0
MOVE.W D0,WordNumber
ADDQ.W #1,TextOffset
BSR PrintHexWord
MOVE.W 28(A5),D0
ADD.W D0,D0
MOVE.W D0,WordNumber
ADDQ.W #1,TextOffset
BSR PrintHexWord
ADD.W #220,D6 ; 218
LEA 30(A5),A5
DBRA D7,spndploop
RTS
PED_EnterPath
JSR StorePtrCol
JSR SetWaitPtrCol
CLR.L EditMode
LEA PEdDefaultPath(PC),A6
BSR UpdateLineCurPos
MOVE.L A6,TextEndPtr
MOVE.L A6,ShowTextPtr
ADD.L #31,TextEndPtr
MOVE.W #20,TextLength
MOVE.L #178,A4
BSR GetTextLine
CLR.L TextEndPtr
JMP RestorePtrCol
PED_Disk
JSR StorePtrCol
JSR SetWaitPtrCol
CLR.L EditMode
CLR.B SndDiskNum0
CLR.B SndDiskNum1
LEA SndDiskNum0(PC),A6
MOVE.L A6,TextEndPtr
MOVE.L A6,ShowTextPtr
ADDQ.L #2,TextEndPtr
MOVE.W #2,TextLength
MOVE.L #621,A4
MOVE.B #3,EnterTextFlag
BSR GetTextLine
LEA SndDiskNum0(PC),A6
MOVE.B #':',2(A6)
CLR.B EnterTextFlag
CLR.L TextEndPtr
JMP RestorePtrCol
ShowPEDnumbers
MOVE.W PresetTotal,WordNumber
MOVE.W #1061,TextOffset
BSR Print4DecDigits
LEA PEdDefaultPath,A0
MOVE.W #178,D1
MOVEQ #20,D0
BSR ShowText3
LEA PEdDefaultVol,A0
MOVE.W #618,D1
MOVEQ #6,D0
BRA ShowText3
PED_PsetHit
CMP.W #1,PresetTotal
BEQ.S pedphend
MOVE.W MouseY2(PC),D0
CMP.W #59,D0
BLO.S pedphend
CMP.W #119,D0
BHS.S pedphend
SUB.W #59,D0
DIVU #6,D0
MOVE.L D0,D1
SWAP D1
CMP.W #5,D1
BEQ.S pedphend
MOVE.W D0,D2
ADD.W PEDpos(PC),D2
CMP.W PresetTotal(PC),D2
BHI.S pedphend
MULU #30,D0
MOVE.L PLSTmem(PC),A5
ADD.L D0,A5
MOVE.W PEDpos(PC),D0
MULU #30,D0
ADD.L D0,A5
TST.W PED_Action
BEQ.S PED_CopyName
CMP.W #1,PED_Action
BEQ PED_DoDelete
pedphend
RTS
PED_CopyName
LEA PresetName(PC),A0
MOVEQ #21,D0
pedcnloop
MOVE.B (A5)+,D1
BNE pedcnskip
MOVE.B #' ',D1
pedcnskip
MOVE.B D1,(A0)+
DBRA D0,pedcnloop
MOVEQ #0,D0
MOVE.B 2(A5),D0
AND.B #$0F,D0
ADD.W D0,D0
LEA fitutexttab(PC),A1
LEA (A1,D0.W),A1
LEA PsetVolText(PC),A0
MOVE.B #' ',-1(A0)
MOVE.B (A1)+,(A0)+
MOVE.B (A1),(A0)
MOVE.W (A5),D0
ADD.W D0,D0
LEA 6(A0),A0
BSR IntToHexASCII
MOVE.W 4(A5),D0
ADD.W D0,D0
LEA 9(A0),A0
BSR IntToHexASCII
LEA 9(A0),A0
MOVE.W 6(A5),D0
ADD.W D0,D0
BSR IntToHexASCII
BRA PossibleEdit
PED_DoDelete
CLR.W PED_Action
LEA DeletePresetText,A0
JSR AreYouSure
BNE Return2
MOVE.L PLSTmem(PC),A1
MOVE.W PresetTotal(PC),D0
MULU #30,D0
ADD.L D0,A1
pedddloop
MOVE.W 30(A5),(A5)
ADDQ.L #2,A5
CMP.L A5,A1
BHI.S pedddloop
CLR.B (A5)
SUBQ.W #1,PresetTotal
SUB.L #30,MaxPLSTOffset
MOVE.W PEDpos(PC),D0
ADD.W #9,D0
CMP.W PresetTotal(PC),D0
BHI.S pedddskip
SUBQ.W #1,PEDpos
pedddskip
BSR ShowPEDnumbers
BSR ShowPresetNames
JSR SetNormalPtrCol
JMP StorePtrCol
sepc JMP SetErrorPtrCol
PLSTisFull
LEA PLSTFullText(PC),A0
BSR ShowStatusText
JMP SetErrorPtrCol
PED_DeleteDisk
LEA DelDiskText(PC),A0
MOVE.B snddisknum0(PC),10(A0)
MOVE.B snddisknum1(PC),11(A0)
JSR AreYouSure
BNE Return2
JSR StorePtrCol
JSR SetWaitPtrCol
MOVE.L PLSTmem(PC),A0
MOVE.L A0,A1
MOVE.W PresetTotal(PC),D0
MULU #30,D0
ADD.L D0,A1
MOVE.L snddisknum0-1(PC),D1
MOVE.L #$FF5F5FFF,D2
AND.L D2,D1
peddslo MOVE.L 2(A0),D0
AND.L D2,D0
CMP.L D1,D0
BNE.S peddsno
MOVE.L A0,A2
peddslp MOVE.W 30(A0),(A0)+
CMP.L A1,A0
BLO.S peddslp
SUBQ.W #1,PresetTotal
SUB.L #30,MaxPLSTOffset
MOVE.L A2,A0
BRA.S peddsn1
peddsno LEA 30(A0),A0
peddsn1 CMP.L A1,A0
BLO.S peddslo
MOVE.W #1,PEDpos
BSR ShowPEDnumbers
BSR ShowPresetNames
JMP RestorePtrCol
DelDiskText dc.b "Delete ST-.. ?",0,0
;************ MIDI Routines ************
* Apollon MIDI Routines V0.2 *
* V0.2 04/07-1991 First version *
_RVOAllocMiscResource = -6
_RVOFreeMiscResource = -12
OpenMIDI
TST.L MIDIinBuffer
BNE.S omidisk
MOVE.L #256,D0
MOVE.L #MEMF_PUBLIC!MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,MIDIinBuffer
BEQ Return2
omidisk CLR.B MIDIinTo
CLR.B MIDIinFrom
BSR.S .GetSer2 ;got the port?
BEQ.S .end ;yes
MOVE.L 4.W,A6 ;no..try to flush serial.device:
JSR LVOForbid(A6)
LEA DeviceList(A6),A0 ;ExecBase->DeviceList
LEA SerDevName(PC),a1 ;"serial.device"
JSR LVOFindName(A6)
TST.L D0
BEQ.S .notfnd ;no serial.device!!
MOVE.L D0,A1
JSR LVORemDevice(A6)
.notfnd JSR LVOPermit(A6)
BSR.S .GetSer2 ;now try it again...
.end RTS
.GetSer2
MOVE.L 4.W,A6
MOVEQ #0,D0
LEA MiscResName(PC),a1
JSR LVOOpenResource(A6)
MOVE.L D0,MiscResBase
BEQ .gs_err
MOVE.L D0,A6
LEA rb_ProgName,A1
MOVEQ #0,D0 ;serial port
JSR _RVOAllocMiscResource(A6)
TST.L D0
BNE.S .gs_err
ST.B SerPortAlloc
CLR.W PrevBits
MOVE.W $DFF01C,D0
BTST #0,D0
SNE.B PrevBits
BTST #11,D0
SNE.B PrevBits+1
MOVEQ #0,D0 ;TBE
LEA MIDIOutInterrupt(PC),A1
MOVE.L 4.W,A6
JSR LVOSetIntVector(A6)
MOVE.L D0,PrevTBE
MOVEQ #11,D0 ;RBF
LEA MIDIInInterrupt(pc),A1
JSR LVOSetIntVector(A6)
MOVE.L D0,PrevRBF
MOVE.W #114,$DFF032 ;set baud rate 114/31250 (SERPER)
MOVE.W #$8801,$DFF09A ;RBF & TBE on!!
MOVE.W #30000,D0
.lolo MOVE.W #$0F0,$DFF180
DBRA D0,.lolo
MOVEQ #0,D0
RTS
.gs_err MOVE.W #30000,D0
.lplp MOVE.W #$F00,$DFF180
DBRA D0,.lplp
MOVEQ #-1,D0
RTS
;----- Close MIDI and release serial port -----
CloseMIDI
MOVE.L MIDIinBuffer(PC),D0
BEQ.S clmskip
MOVE.L D0,A1
MOVE.L #256,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
CLR.L MIDIinBuffer
clmskip
TST.L MiscResBase
BEQ.S .fs_end
TST.B SerPortAlloc
BEQ.S .fs_end
MOVE.W #$0801,$dff09a ;disable RBF & TBE
MOVE.L PrevTBE(PC),a1
MOVEQ #0,D0
MOVE.L 4.W,A6
JSR LVOSetIntVector(A6)
MOVE.L PrevRBF(PC),a1
MOVEQ #11,D0
JSR LVOSetIntVector(A6)
MOVE.W #$8000,D0
TST.B PrevBits
BEQ.S .fs1
BSET #0,D0
.fs1 TST.B PrevBits+1
BEQ.S .fs2
BSET #11,D0
.fs2 MOVE.W D0,$DFF09A ;set RBF & TBE to their prev. values
MOVE.L MiscResBase(PC),A6
MOVEQ #0,D0 ;serial port
JSR _RVOFreeMiscResource(A6)
CLR.B SerPortAlloc
CLR.B lastcmdbyte
.fs_end RTS
mintflag dc.w 0
;----- Every time we receive a MIDI byte -----
MIDIInIntHandler
MOVE.W $DFF018,D0 ; read from serdatr
MOVE.W #$0800,$DFF09C ;intreq
MOVE.W #$F00,$DFF180
MOVEM.L D1-D2,-(SP)
gmiskip MOVEQ #0,D1
MOVE.B 4(A1),D1 ; in to
MOVE.L D1,D2
ADDQ.B #1,D2
CMP.B 5(A1),D2 ; in from
BEQ gmiexit ; Buffer overflow
MOVE.L (A1),A0 ; midi in buffer
MOVE.B D0,(A0,D1.W)
MOVE.B D2,4(A1); MIDIinTo
gmiexit MOVEM.L (SP)+,D1-D2
RTS
;----- MIDI Transmit Buffer Empty Interrupt (Output) -----
MIDIOutIntHandler
MOVE.W #$4000,intena(A0) ;disable int.
ADDQ.B #1,IDNestCnt(A6) ;turn off multitasking
MOVE.W #1,intreq(A0) ;clear intreq bit
MOVE.B bytesinbuff(PC),D0
BEQ.S exsih ;buffer empty
MOVE.L 4(A1),A5 ;get buffer read pointer
MOVE.W #$100,D1 ;Stop bit
MOVE.B (A5),D1 ;get byte
MOVE.W D1,$030(A0) ;and push it out!!
ADDQ.L #1,A5 ;add 1
CMP.L A1,A5 ;shall we reset ptr??
BNE.S nbufptr ;not yet..
LEA sendbuffer(PC),A5
nbufptr SUBQ.B #1,D0 ;one less bytes in buffer
MOVE.B D0,bytesinbuff ;remember it
MOVE.L A5,4(A1) ;push new read pointer back
exsih SUBQ.B #1,IDNestCnt(A6) ;multitasking back on
BGE.S exsih0
MOVE.W #$C000,intena(A0)
exsih0 RTS
;----- Send data to MIDI Out or to output buffer -----
; A0=ptr to data, D0=length
AddMIDIData
TST.B SerPortAlloc
BEQ.S retamd
MOVE.L A2,-(SP)
MOVE.L 4.W,A6
MOVE.W #$4000,$DFF09A ;Disable interrupts
ADDQ.B #1,IDNestCnt(A6)
MOVE.B bytesinbuff(pc),D1
BNE.S noTBEreq
MOVE.W #$8001,$DFF09C ;request TBE
noTBEreq
LEA buffptr(PC),A2 ;end of buffer (ptr)
MOVE.L (A2),A1 ;buffer pointer
adddataloop
MOVE.B (A0)+,D1 ;get byte
BPL.S norscheck ;this isn't a status byte
CMP.B #$EF,D1 ;forget system messages
BHI.S norscheck
CMP.B lastcmdbyte(PC),D1 ;same as previos status byte??
BEQ.S samesb ;yes, skip
MOVE.B D1,lastcmdbyte ;no, don't skip but remember!!
norscheck
MOVE.B D1,(A1)+ ;push it to midi send buffer
ADDQ.B #1,bytesinbuff
samesb CMP.L A2,A1 ;end of buffer??
BNE.S noresbuffptr ;no, no!!
LEA sendbuffer(pc),a1 ;better reset it to avoid trashing
noresbuffptr
SUBQ.B #1,D0
BNE.S adddataloop
MOVE.L A1,(A2) ;push new buffer ptr back
overflow
SUBQ.B #1,IDNestCnt(A6)
BGE.S retamd1
MOVE.W #$C000,$DFF09A ;enable interrupts again
retamd1 MOVE.L (SP)+,A2
retamd RTS
PrevTBE dc.l 0
PrevRBF dc.l 0
PrevBits dc.b 0,0
MIDIOutInterrupt
dc.l 0,0
dc.b 2,0
dc.l MIDIOutName,buffptr,MIDIOutIntHandler
MIDIInInterrupt
dc.l 0,0
dc.b 2,0
dc.l MIDIInName,MIDIinBuffer,MIDIInIntHandler
buffptr dc.l sendbuffer
readbuffptr dc.l sendbuffer
sendbuffer ds.b 128
SerPortAlloc dc.b 0
bytesinbuff dc.b 0
MiscResBase dc.l 0
lastcmdbyte dc.b 0
even
MIDIOutName dc.b 'PT MIDI Out',0
MIDIInName dc.b 'PT MIDI In',0
MiscResName dc.b 'misc.resource',0
SerDevName dc.b 'serial.device',0
even
;----- read from input buffer -----
MIDIin MOVE.B MIDIinFrom(PC),D0
CMP.B MIDIinTo(PC),D0
BNE migetbyt
MOVEQ #2,D1
RTS
migetbyt
MOVE.L MIDIinBuffer(PC),A0
MOVE.L A0,$7FFF0
MOVE.B (A0,D0.W),D0
ADDQ.B #1,MIDIinFrom
MOVEQ #0,D1
RTS
CheckMIDIin
TST.B MIDIFlag
BEQ Return2
BSR MIDIin
TST.L D1
BEQ mic_ok
MOVE.B #1,MIDIError
RTS
mic_ok CLR.B MIDIError
TST.B D0
BPL mic_databyte
;statusbyte here
CMP.B #$F0,D0
BHS MIDISysMessage
MOVE.B D0,MIDIRunStatus
MOVE.B D0,D1
AND.B #$F0,D1
MOVE.B D1,MIDIRunCommand
AND.B #$0F,D0
MOVE.B D0,MIDIRunChannel
CLR.B MIDIByteCount
RTS
mic_databyte
MOVE.B MIDIRunCommand(PC),D1
CMP.B #$80,D1
BEQ M_NoteOff
CMP.B #$90,D1
BEQ M_NoteOn
CMP.B #$A0,D1
BEQ M_PolyTouch
CMP.B #$B0,D1
BEQ M_Control
CMP.B #$C0,D1
BEQ M_ProgChange
CMP.B #$D0,D1
BEQ M_MonoTouch
CMP.B #$E0,D1
BEQ M_PitchBend
CMP.B #$F0,D1
BEQ M_SysExData
RTS
M_NoteOff
TST.B MIDIByteCount
BNE mnf_veloc
MOVE.B D0,MIDINote
ADD.B #1,MIDIByteCount
RTS
mnf_veloc
CLR.B MIDIByteCount
MOVE.B D0,MIDIVelocity
; BSR MidiPlay
RTS
M_NoteOn
MOVE.W #$F0F,$DFF180
TST.B MIDIByteCount
BNE mno_veloc
MOVE.B D0,MIDINote
ADD.B #1,MIDIByteCount
RTS
mno_veloc
CLR.B MIDIByteCount
MOVE.B D0,MIDIVelocity
BEQ mnf_veloc
;* MidiPlay *
MOVE.B MIDINote,D0
CMP.B MIDIinTrans,D0
BLO miplskip
SUB.B MIDIinTrans(PC),D0
CMP.B #36,D0
BLS J_nkp
RTS
miplskip
CMP.B XMIDI_Play,D0
BEQ J_PlaySong
CMP.B XMIDI_Pattern,D0
BEQ J_PlayPattern
CMP.B XMIDI_Edit,D0
BEQ J_Edit
CMP.B XMIDI_Record,D0
BEQ J_RecordPattern
CMP.B XMIDI_Stop,D0
BEQ J_StopIt
RTS
J_nkp JMP nkpskip
J_PlaySong
JMP PlaySong
J_PlayPattern
JMP PlayPattern
J_Edit JMP Edit
J_RecordPattern
JMP RecordPattern
J_StopIt
JMP StopIt
MIDIinTrans dc.b 60,0
XMIDI_Play dc.b 40 ; E
XMIDI_Pattern dc.b 38 ; D
XMIDI_Edit dc.b 43 ; G
XMIDI_Record dc.b 41 ; F
XMIDI_Stop dc.b 36 ; C
dc.b 0 ; free 0
M_PolyTouch
TST.B MIDIByteCount
BNE mpt_touch
MOVE.B D0,MIDINote
ADD.B #1,MIDIByteCount
RTS
mpt_touch
CLR.B MIDIByteCount
MOVE.B D0,MIDITouch
RTS
M_Control
TST.B MIDIByteCount
BNE mc_value
MOVE.B D0,MIDIController
ADD.B #1,MIDIByteCount
RTS
mc_value
CLR.B MIDIByteCount
MOVE.B D0,MIDIlsb
RTS
M_ProgChange
MOVE.B D0,MIDIProgram
RTS
; ADDQ.B #1,D0
; AND.B #$1F,D0
; BNE mpchskip
; TST.W InsNum
; BEQ mpchskip
; MOVE.W InsNum(PC),LastInsNum
;mpchskip
; MOVE.B D0,InsNum+1
; BRA ShowSampleInfo
M_MonoTouch
MOVE.B D0,MIDITouch
RTS
M_PitchBend
TST.B MIDIByteCount
BNE mp_msb
MOVE.B D0,MIDIlsb
ADD.B #1,MIDIByteCount
RTS
mp_msb CLR.B MIDIByteCount
MOVE.B D0,MIDImsb
EXT.W D0
SUB.W #128,D0
MOVE.W CurrentPlayNote,D1
SUB.W D0,D1
CMP.W #113,D1
BLS.S mp_2
MOVE.W #113,D1
mp_2 MOVE.L NoteAddr,A0
MOVE.W D1,6(A0)
RTS
NoteAddr dc.l 0
M_rts RTS
MIDISysMessage
CMP.B #$F0,D0
BEQ M_SysEx ; System Exclusive
CMP.B #$F1,D0
BEQ M_rts ; Quarter Frame (MIDI Time Code)
CMP.B #$F2,D0
BEQ M_SongPos ; Song Position Pointer
CMP.B #$F3,D0
BEQ M_SongSelect ; Song Select
CMP.B #$F4,D0
BEQ M_rts ; -Reserved-
CMP.B #$F5,D0
BEQ M_rts ; -Reserved-
CMP.B #$F6,D0
BEQ M_rts ; -Reserved-
CMP.B #$F7,D0
BEQ M_EOX ; End of System Exclusive
CMP.B #$F8,D0
BEQ M_rts ; MIDI Timing Clock
CMP.B #$F9,D0
BEQ M_rts ; -Reserved-
CMP.B #$FA,D0
BEQ M_Start ; Start Message
CMP.B #$FB,D0
BEQ M_Continue ; Continue Message
CMP.B #$FC,D0
BEQ M_Stop ; Stop Message
CMP.B #$FD,D0
BEQ M_rts ; --- Reserved ---
CMP.B #$FE,D0
BEQ M_rts ; Active Sensing (Each 300ms if on)
CMP.B #$FF,D0
BRA M_rts ; System Reset Message
M_SysEx RTS
M_SysExData RTS
M_SongPos RTS
M_SongSelect RTS
M_EOX RTS
M_Start JMP PlaySong
M_Continue RTS
M_Stop JMP StopIt
MIDIinBuffer dc.l 0
MIDIinTo dc.b 0
MIDIinFrom dc.b 0
MIDIRunStatus dc.b $80
MIDIRunChannel dc.b 0
MIDIRunCommand dc.b $08
MIDIByteCount dc.b 0
MIDINote dc.b 0
MIDIVelocity dc.b 0
MIDITouch dc.b 0
MIDIController dc.b 0
MIDImsb dc.b 0
MIDIlsb dc.b 0
MIDIProgram dc.b 0
MIDIError dc.b 0
;---- Sampler Screen ----
SamplerScreen
CLR.B RawKeyCode
JSR WaitForButtonUp
TST.W SamScrEnable
BNE ExitFromSam
MOVE.W #1,SamScrEnable
MOVE.L EditMode(PC),SaveEditMode
CLR.L EditMode
MOVE.L TextBplPtr(PC),A0
LEA $15B8(A0),A0
MOVE.L A0,D0
LEA CopList2Bpl4Ptr,A1
MOVE.W D0,6(A1)
SWAP D0
MOVE.W D0,2(A1)
MOVEQ #0,D0
MOVE.W #270,D1
MOVEQ #14,D2
LEA CursorSpriteData,A0
BSR SetSpritePos
JSR SetSamSpritePtrs
MOVE.W CopCol0+16,CopList2+18
BSR SwapSamScreen
BEQ exisam2
BSR ClearSamScr
JSR DoShowFreeMem
BSR ShowSamNote
BSR ShowResamNote
BRA RedrawSample
ExitFromSam
JSR WaitForButtonUp
MOVE.L SamMemPtr,D0
BEQ exisam2
MOVE.L D0,A1
BSR Bjarne
BSR.S FreeDecompMem2
exisam2 JSR SetDefSpritePtrs
CLR.B RawKeyCode
CLR.W SamScrEnable
MOVEQ #-1,D0
MOVE.L D0,MarkStartOfs
MOVE.L SaveEditMode(PC),EditMode
BSR SetScreenColors2
JSR SetupVUCols
BSR SetScrPatternPos
BSR ClearSamScr
JSR UpdateCursorPos
JSR SetTempo
BRA RedrawPattern
FreeDecompMem2
MOVE.L SamMemPtr,D0
BEQ Return2
MOVE.L D0,A1
MOVE.L SamMemSize,D0
CLR.L SamMemPtr
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
RTS
Decompact2
MOVE.L A0,CompPtr
MOVE.L D0,CompLen
BSR.S FreeDecompMem2
MOVE.L CompPtr(PC),A0
MOVE.L (A0),D0
MOVE.L D0,SamMemSize
MOVEQ #0,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,SamMemPtr
BEQ OutOfMemErr
MOVE.L D0,A1
MOVE.L CompPtr(PC),A0
MOVE.L CompLen(PC),D0
ADDQ.L #4,A0
SUBQ.L #4,D0
dcmlop3 MOVE.B (A0)+,D1
CMP.B #181,D1
BEQ.S DecodeIt3
MOVE.B D1,(A1)+
decom3 SUBQ.L #1,D0
CMP.L #0,D0
BGT.S dcmlop3
MOVE.L SamMemPtr(PC),A1
MOVEQ #-1,D0
RTS
DecodeIt3
MOVEQ #0,D1
MOVE.B (A0)+,D1
MOVE.B (A0)+,D2
dcdlop3 MOVE.B D2,(A1)+
DBRA D1,dcdlop3
SUBQ.L #2,D0
BRA.S decom3
SwapSamScreen
LEA SampScreenData,A0
MOVE.L #SampScreenSize,D0
BSR Decompact2
BEQ Return2
bjasize=134*10
Bjarne LEA SamScrPos,A0
MOVEQ #1,D2
BjaLop1 MOVE.W #bjasize-1,D1 ; 134
BjaLop2 MOVE.L (A0),D0
MOVE.L (A1),(A0)+
MOVE.L D0,(A1)+
DBRA D1,BjaLop2
ADD.L #10240-bjasize*4,A0
DBRA D2,BjaLop1
LEA CopListInsPos,A0
LEA CopList2,A1
MOVEQ #29,D1
BjaLoop MOVE.W (A0),D0
MOVE.W (A1),(A0)+
MOVE.W D0,(A1)+
DBRA D1,BjaLoop
MOVEQ #-1,D0
RTS
ClearSamScr
MOVE.W #5121,TextOffset
MOVE.W #2,TextLength
MOVE.L #blnktxt,ShowTextPtr
BSR ShowText
MOVE.W #4964,TextOffset
MOVE.W #3,TextLength
BSR ShowText
MOVE.W #130*10-1,D0
MOVE.L TextBplPtr,A0
LEA $15B8(A0),A0
MOVE.L A0,LineScreen
MOVEQ #0,D1
clrsslp MOVE.L D1,(A0)+
DBRA D0,clrsslp
RTS
blnktxt dc.b " "
ClearSamArea
MOVE.W #64*10-1,D0
MOVE.L TextBplPtr,A0
LEA $15B8(A0),A0
MOVE.L A0,LineScreen
MOVEQ #0,D1
clrsare MOVE.L D1,(A0)+
DBRA D0,clrsare
RTS
CheckSamGadgets
MOVEM.W MouseX2,D0/D1
CMP.W #139,D1
BLO SamTopBar
CMP.W #139+64,D1
BLO SamplePressed
CMP.W #201+11,D1
BLO SamDragBar
CMP.W #201+22,D1
BLO SamMenu1
CMP.W #201+33,D1
BLO SamMenu2
CMP.W #201+44,D1
BLO SamMenu3
CMP.W #201+66,D1
BLO SamMenu4
RTS
SamTopBar
CMP.W #32,D0
BLO ExitFromSam
RTS
SamMenu1
CMP.W #32,D0
BLO Return2
CMP.W #96,D0
BLO PlayWaveform
CMP.W #176,D0
BLO ShowRange
CMP.W #246,D0
BLO ZoomOut
BRA DispBox
SamMenu2
CMP.W #32,D0
BLO StopPlaying
CMP.W #96,D0
BLO PlayDisplay
CMP.W #176,D0
BLO ShowAll
CMP.W #246,D0
BLO RangeAll
BRA LoopToggle
SamMenu3
CMP.W #32,D0
BLO StopPlaying
CMP.W #96,D0
BLO PlayRange
CMP.W #116,D0
BLO CurToStart
CMP.W #136,D0
BLO CurToEnd
CMP.W #176,D0
BLO SwapBuffer
CMP.W #246,D0
BLO Sampler
BRA SetSamNote
SamMenu4
CMP.W #32,D0
BLO SamCut
CMP.W #64,D0
BLO SamCopy
CMP.W #96,D0
BLO SamPaste
CMP.W #136,D0
BLO RampVolume
CMP.W #176,D0
BLO TuningTone
CMP.W #246,D0
BLO Resample
BRA SetResamNote
PlayWaveform
JSR PlayNote
JMP WaitForButtonUp
PlayDisplay
LEA SampleInfo,A0
MOVE.L SamOffset(PC),StartOfs
MOVE.L SamDisplay(PC),D0
LSR.L #1,D0
MOVE.W D0,(A0)
CLR.W 4(A0)
MOVE.W #1,6(A0)
MOVE.W PlayInsNum,-(SP)
CLR.W PlayInsNum
JSR PlayNote
MOVE.W (SP)+,PlayInsNum
BSR ShowSampleInfo
JMP WaitForButtonUp
PlayRange
MOVE.L MarkStartOfs(PC),D1
BMI NoRangeError
MOVE.L MarkEndOfs(PC),D0
CMP.L D0,D1
BEQ LargerRangeError
LEA SampleInfo,A0
MOVE.L D1,StartOfs
SUB.L D1,D0
LSR.L #1,D0
MOVE.W D0,(A0)
CLR.W 4(A0)
MOVE.W #1,6(A0)
MOVE.W PlayInsNum,-(SP)
CLR.W PlayInsNum
JSR PlayNote
MOVE.W (SP)+,PlayInsNum
BSR ShowSampleInfo
JMP WaitForButtonUp
StopPlaying
BRA TurnOffVoices
StartOfs
dc.l 0
;----
ShowRange
MOVE.L MarkStartOfs(PC),D0
BMI NoRangeError
MOVE.L MarkEndOfs(PC),D1
CMP.L D1,D0
BEQ LargerRangeError
SUB.L D0,D1
BNE shorano
MOVEQ #1,D1
shorano MOVE.L D1,SamDisplay
MOVE.L D0,SamOffset
MOVEQ #-1,D0
MOVE.L D0,MarkStartOfs
CLR.W MarkStart
BSR DisplaySample
JMP WaitForButtonUp
ZoomOut MOVE.L SamDisplay(PC),D0
MOVE.L SamLength(PC),D1
MOVE.L SamOffset(PC),D2
MOVE.L D0,D3
LSL.L #1,D3
CMP.L D1,D3
BHI ShowAll
LSR.L #1,D0
CMP.L D2,D0
BLO zoomou2
MOVEQ #0,D0
zoomou2 SUB.L D0,D2
MOVE.L D2,D0
ADD.L D3,D0
CMP.L D1,D0
BLS zoomou3
SUB.L D3,D1
MOVE.L D1,D2
zoomou3 MOVE.L D2,SamOffset
MOVE.L D3,SamDisplay
BSR OffsetToMark
MOVE.L MarkStartOfs(PC),D0
CMP.L MarkEndOfs(PC),D0
BNE zoomouo
MOVEQ #-1,D0
MOVE.L D0,MarkStartOfs
zoomouo BSR DisplaySample
JMP WaitForButtonUp
ShowAll CLR.L SamOffset
MOVE.L SamLength(PC),SamDisplay
BSR OffsetToMark
MOVE.L MarkStartOfs(PC),D0
CMP.L MarkEndOfs(PC),D0
BNE shoallo
MOVEQ #-1,D0
MOVE.L D0,MarkStartOfs
CLR.W MarkStart
shoallo BSR DisplaySample
JMP WaitForButtonUp
RangeAll
BSR InvertRange
MOVE.W #3,MarkStart
MOVE.W #316,MarkEnd
BSR MarkToOffset
ranall2 BSR InvertRange
JMP WaitForButtonUp
CurToStart
BSR InvertRange
MOVEQ #3,D0
MOVE.W D0,MarkStart
MOVE.W D0,MarkEnd
MOVE.L SamOffset(PC),D0
MOVE.L D0,MarkStartOfs
MOVE.L D0,MarkEndOfs
BRA.S ranall2
CurToEnd
BSR InvertRange
MOVE.W #316,D0
MOVE.W D0,MarkStart
MOVE.W D0,MarkEnd
MOVE.L SamOffset(PC),D0
ADD.L SamDisplay(PC),D0
MOVE.L D0,MarkStartOfs
MOVE.L D0,MarkEndOfs
BRA.S ranall2
SwapBuffer
MOVE.W InsNum(PC),D1
BEQ NotSampleNull
LSL.W #2,D1
LEA SamplePtrs,A0
LEA (A0,D1.W),A0
MOVE.L CopyBufPtr(PC),D0
MOVE.L (A0),CopyBufPtr
MOVE.L D0,(A0)
MOVE.L D0,A1
CLR.W (A1)
MOVE.L CopyBufSize(PC),D0
MOVE.L 124(A0),CopyBufSize
MOVE.L D0,124(A0)
MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D1
MULU #30,D1
LEA 12(A0,D1.W),A0
LSR.L #1,D0
MOVE.W D0,(A0)
MOVE.L RepBuf(PC),D0
MOVE.L 4(A0),RepBuf
MOVE.L D0,4(A0)
MOVE.W RepBuf2(PC),D0
MOVE.W 2(A0),RepBuf2
TST.B D0
BNE.S swabuf2
MOVE.B #$40,D0
swabuf2 MOVE.W D0,2(A0)
JSR TurnOffVoices
BSR ValidateLoops
BSR ShowSampleInfo
BSR UpdateRepeats
BSR RedrawSample
JMP WaitForButtonUp
RepBuf dc.l 1
RepBuf2 dc.w $0040
;----
NoRangeError
LEA NoRangeText(PC),A0
nres2 BSR ShowStatusText
JMP SetErrorPtrCol
LargerRangeError
LEA LargerRangeText(PC),A0
BRA.S nres2
SetCursorError
LEA SetCursorText(PC),A0
BRA.S nres2
BufIsEmptyError
LEA BufIsEmptyText(PC),A0
BRA.S nres2
EmptySampleError
LEA EmptySampleText(PC),A0
BRA.S nres2
NoRangeText dc.b "no range selected",0
LargerRangeText dc.b "set larger range",0
SetCursorText dc.b "set cursor pos",0
BufIsEmptyText dc.b "buffer is empty",0
EmptySampleText dc.b "sample is empty",0
;----
DispBox
RTS
LoopToggle
JSR WaitForButtonUp
MOVE.W InsNum(PC),D1
BEQ NotSampleNull
MOVE.L SongDataPtr(PC),A0
MULU #30,D1
LEA 12(A0,D1.W),A0
TST.W LoopOnOffFlag
BEQ.S loopton
MOVE.L 4(A0),SavSamInf
MOVEQ #1,D0
MOVE.L D0,4(A0)
BSR ValidateLoops
JSR TurnOffVoices
looptlo BSR ShowSampleInfo
BSR UpdateRepeats
BRA DisplaySample
loopton MOVE.L SavSamInf(PC),D0
BNE.S loopto2
MOVE.W (A0),D0
loopto2 MOVE.L D0,4(A0)
BSR ValidateLoops
BRA looptlo
ShowLoopToggle
LEA ToggleOFFText(PC),A0
TST.W LoopOnOffFlag
BEQ.S sltskip
LEA ToggleONText(PC),A0
sltskip MOVEQ #3,D0
MOVE.W #9076,D1
BRA ShowText3
LoopOnOffFlag dc.w 0
SavSamInf dc.l 0
SetSamNote
BSR ShowResamNote
MOVE.W #9516,TextOffset
MOVE.W #3,TextLength
MOVE.L #SpcNoteText,ShowTextPtr
BSR ShowText
MOVE.W #1,SamNoteType
MOVE.L #SampleNote,SplitAddress
JMP WaitForButtonUp
SetResamNote
BSR ShowSamNote
MOVE.W #9956,TextOffset
MOVE.W #3,TextLength
MOVE.L #SpcNoteText,ShowTextPtr
BSR ShowText
MOVE.W #2,SamNoteType
MOVE.L #ResampleNote,SplitAddress
JMP WaitForButtonUp
ResampleText dc.b "Resample?",0
ResamplingText dc.b "Resampling...",0
Resample
LEA ResampleText(PC),A0
JSR AreYouSure
BNE Return2
JSR StorePtrCol
JSR SetWaitPtrCol
LEA ResamplingText(PC),A0
BSR ShowStatusText
LEA SamplePtrs,A0
MOVE.W InsNum(PC),D1
BEQ NotSampleNull
LSL.W #2,D1
LEA (A0,D1.W),A0
MOVE.L (A0),D0
BEQ ERC2
MOVE.L D0,A2
MOVE.L 124(A0),D6
CMP.L #2,D6
BLS ERC2
MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D1
MULU #30,D1
MOVEQ #0,D0
MOVE.B 12+2(A0,D1.W),D0 ; finetune
MULU #37*2,D0
LEA PeriodTable(PC),A0
ADD.L D0,A0
MOVEQ #0,D1
MOVE.W ResampleNote(PC),D1
LSL.W #1,D1
MOVE.W (A0,D1.W),D1
BEQ ERC2
LEA PeriodTable,A0
MOVEQ #0,D5
MOVE.W TuneNote,D5
LSL.W #1,D5
MOVE.W (A0,D5.W),D5
BEQ ERC2
; D1=resamperiod, D5=tuneperiod
MOVE.L D5,D0 ; tune
LSL.L #8,D0
LSL.L #4,D0 ; * 4096
DIVU D1,D0 ; / resample
MOVEQ #0,D4
MOVE.W D0,D4
LSL.L #4,D4 ; hi-word=add value, lo-word=fraction
MOVE.W D6,D7
LSR.W #1,D7
MULU D1,D7
DIVU D5,D7
AND.L #$FFFF,D7
CMP.W #2,D7
BLO ERC2
CMP.W #$7FFF,D7
BLO resamlo
MOVE.W #$7FFF,D7
resamlo ADD.L D7,D7
MOVE.L D7,D0
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
TST.L D0
BEQ SamMemError
MOVE.L D0,A1
MOVE.L D0,A3
JSR TurnOffVoices
MOVE.L A2,A0
; D4=resample value, D6=old length, D7=new length
; A0/A2=old sample, A1/A3=new sample
MOVE.W #32767,D1
MOVEQ #0,D3
MOVEQ #0,D5
resampleloop
MOVE.B 1(A0),D0
EXT.W D0
MULS D1,D0
MOVE.B (A0),D2
EXT.W D2
MULS D3,D2
ADD.L D2,D0
ASR.L #8,D0
ASR.L #7,D0
MOVE.B D0,(A1)+
ADD.L D4,D5
SWAP D5
MOVE.L A2,A0
MOVEQ #0,D0
MOVE.W D5,D0
ADD.L D0,A0
SWAP D5
MOVE.W D5,D1
LSR.W #1,D1
MOVE.W #32767,D3
SUB.W D1,D3
MOVE.L A1,A4
SUB.L A3,A4
CMP.L D7,A4
BHS.S resamskip
MOVE.L A0,A4
SUB.L A2,A4
CMP.L D6,A4
BLO.S resampleloop
resamskip
MOVE.L A2,A1
MOVE.L D6,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
MOVE.W InsNum(PC),D1
LSL.W #2,D1
LEA SamplePtrs,A0
LEA (A0,D1.W),A0
MOVE.L A3,(A0)
MOVE.L D7,124(A0)
MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D1
MULU #30,D1
LEA 12(A0,D1.W),A0
LSR.L #1,D7
MOVE.W D7,(A0)
CLR.B 2(A0)
CLR.W 4(A0)
MOVE.W #1,6(A0)
JSR RestorePtrCol
BSR ClearSamStarts
BSR ShowSampleInfo
BSR ShowAllRight
BRA RedrawSample
ERC2 JMP ErrorRestoreCol
SamCut CLR.B RawKeyCode
MOVE.L MarkStartOfs(PC),D0
BMI NoRangeError
CMP.L MarkEndOfs(PC),D0
BEQ LargerRangeError
TST.B CutToBufFlag
BEQ.S samcut2
BSR SamCopy
samcut2 BSR TurnOffVoices
LEA SamplePtrs(PC),A0
MOVE.W InsNum(PC),D1
BEQ NotSampleNull
LSL.W #2,D1
LEA (A0,D1.W),A0
MOVE.L (A0),D0
BEQ EmptySampleError
MOVE.L 124(A0),D2
CMP.L #2,D2
BLO EmptySampleError
MOVE.L D0,A1
MOVE.L D0,A2 ; sample start
MOVE.L D0,A3
MOVE.L D0,A4
MOVE.L D0,A5
ADD.L MarkStartOfs(PC),A3 ; mark start
MOVE.L MarkEndOfs(PC),D0
SUB.L MarkStartOfs(PC),D0
CMP.L D2,D0
BHS Destroy
MOVE.L MarkEndOfs(PC),D0
CMP.L D2,D0
BLO.S samsome
MOVE.L D2,D0
SUBQ.L #1,D0
samsome ADD.L D0,A4 ; mark end
ADD.L D2,A5 ; sample end
MOVE.L A3,D0
SUB.L A2,D0
ADD.L A5,D0
SUB.L A4,D0
BNE sacoklen
MOVEQ #0,D3
MOVEQ #0,D4
BRA sacfree
sacoklen
MOVE.L D0,D3
MOVEQ #MEMF_CHIP,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,D4
BEQ OutOfMemErr ; No memory
MOVE.L D0,A0
MOVE.L A2,A1
MOVE.L A3,D0
SUB.L A2,D0
BRA.S sacskp1
saclop1 MOVE.B (A2)+,(A0)+
sacskp1 DBRA D0,saclop1
MOVE.L A5,D0
SUB.L A4,D0
BRA.S sacskp2
smclop2 MOVE.B (A4)+,(A0)+
sacskp2 DBRA D0,smclop2
sacfree MOVE.L D2,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
MOVE.W InsNum(PC),D1
LSL.W #2,D1
LEA SamplePtrs(PC),A0
LEA (A0,D1.W),A0
MOVE.L D4,(A0)
MOVE.L D3,124(A0)
MOVE.L D4,SamStart
MOVE.L D3,SamLength
MOVE.L SamOffset(PC),D4
ADD.L SamDisplay(PC),D4
CMP.L D3,D4
BLO samcuto ; display ok
MOVE.L SamDisplay(PC),D4
CMP.L D3,D4
BLO samnils ; if display < length, move offset
samsall CLR.L SamOffset ; else show all
MOVE.L D3,SamDisplay
BRA samcuto
samnils MOVE.L D3,D4
SUB.L SamDisplay(PC),D4
BMI.S samsall ; if offset < 0, show all
MOVE.L D4,SamOffset
samcuto MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D1
MULU #30,D1
LEA 12(A0,D1.W),A0
LSR.L #1,D3
MOVE.W D3,(A0)
MOVE.W 4(A0),D0
CMP.W D3,D0
BLS.S samcuxx
MOVEQ #1,D0
MOVE.L D0,4(A0)
BRA.S samcuex
samcuxx ADD.W 6(A0),D0
CMP.W D3,D0
BLS.S samcuex
SUB.W 4(A0),D3
MOVE.W D3,6(A0)
samcuex MOVE.L MarkStartOfs(PC),MarkEndOfs
BSR ClearSamStarts
BSR ValidateLoops
BSR ShowSampleInfo
BRA DisplaySample
SamCopy CLR.B RawKeyCode
MOVE.L MarkStartOfs(PC),D0
BMI NoRangeError
CMP.L MarkEndOfs(PC),D0
BEQ LargerRangeError
LEA SamplePtrs(PC),A0
MOVE.W InsNum(PC),D1
BEQ NotSampleNull
LSL.W #2,D1
LEA (A0,D1.W),A0
MOVE.L (A0),D0
BEQ EmptySampleError
MOVE.L 124(A0),D2
BEQ EmptySampleError
MOVE.L D0,A3
MOVE.L D0,A4
ADD.L MarkStartOfs(PC),A3 ; mark start
MOVE.L MarkEndOfs(PC),D0 ; mark end
CMP.L D2,D0
BLO.S csamsom
MOVE.L D2,D0
SUBQ.L #1,D0
csamsom ADD.L D0,A4
BSR.S FreeCopyBuf
MOVE.L A4,D0
SUB.L A3,D0
ADDQ.L #1,D0
MOVE.L D0,CopyBufSize
MOVEQ #MEMF_CHIP,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
MOVE.L D0,CopyBufPtr
BEQ OutOfMemErr ; No memory
MOVE.L D0,A5
csamlop MOVE.B (A3)+,(A5)+
CMP.L A4,A3
BLS.S csamlop
BSR InvertRange
BSR InvertRange
JMP WaitForButtonUp
FreeCopyBuf
MOVE.L CopyBufPtr(PC),D0
BEQ Return2
MOVE.L D0,A1
MOVE.L CopyBufSize(PC),D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
CLR.L CopyBufPtr
RTS
CopyBufPtr dc.l 0
CopyBufSize dc.l 0
SamPaste
CLR.B RawKeyCode
MOVE.L MarkStartOfs(PC),D0
BMI SetCursorError
LEA SamplePtrs(PC),A0
MOVE.W InsNum(PC),D1
BEQ NotSampleNull
LSL.W #2,D1
LEA (A0,D1.W),A0
MOVEQ #0,D2
MOVE.L (A0),D0
BEQ.S sapanul
MOVE.L 124(A0),D2
sapanul MOVE.L D0,A2
MOVE.L CopyBufPtr(PC),D3
BEQ BufIsEmptyError
MOVE.L D3,A3
MOVE.L CopyBufSize(PC),D3
BEQ BufIsEmptyError
MOVE.L D3,D4 ; copysize
ADD.L D2,D4 ; + origsize
CMP.L #$FFFE,D4
BLO.S sapaok
MOVE.L #$FFFE,D4
sapaok MOVE.L D4,D0
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
TST.L D0
BEQ OutOfMemErr
MOVE.L D0,A4
MOVEQ #0,D0
TST.L D2
BEQ.S sapask1
MOVE.L MarkStartOfs(PC),D0
sapask1 MOVE.L D0,MarkStartOfs
MOVE.L A2,A1
MOVE.L D2,D1
MOVE.L A4,A5
MOVE.L A4,A0
ADD.L D4,A0
; D0 = paste position
; A0 = end of new sample
; A1/D1 = copy of A2/D2
; A2/D2 = original sample
; A3/D3 = copy buffer
; A4/D4 = new sample
; A5 = copy of A4
BRA.S sapask2
sapalp1 MOVE.B (A2)+,(A4)+ ; copy first part
CMP.L A0,A4
BHS.S sapaski
SUBQ.L #1,D2
sapask2 DBRA D0,sapalp1
BRA.S sapask3
sapalp2 MOVE.B (A3)+,(A4)+ ; copy from buffer
CMP.L A0,A4
BHS.S sapaski
sapask3 DBRA D3,sapalp2
TST.L D2
BEQ.S sapaski
BMI.S sapaski
sapalp3 MOVE.B (A2)+,(A4)+ ; copy last part
CMP.L A0,A4
BHS.S sapaski
SUBQ.L #1,D2
BNE.S sapalp3
sapaski MOVE.L D1,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
MOVE.W InsNum(PC),D1
LSL.W #2,D1
LEA SamplePtrs(PC),A0
LEA (A0,D1.W),A0
MOVE.L A5,(A0)
MOVE.L D4,124(A0)
MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D1
MULU #30,D1
LEA 12(A0,D1.W),A0
LSR.L #1,D4
MOVE.W D4,(A0)
MOVE.L MarkStartOfs(PC),MarkEndOfs
BSR OffsetToMark
BSR ClearSamStarts
BSR ShowSampleInfo
BRA RedrawSample
RampVolume
MOVE.L TextBplPtr(PC),A0
LEA 6209(A0),A0
MOVEQ #32,D3
ravlap2 MOVEQ #16,D2
ravlap1 CLR.B (A0)+
DBRA D2,ravlap1
LEA 23(A0),A0
DBRA D3,ravlap2
LEA VolBoxPos,A0
LEA VolBoxData,A1
MOVEQ #1,D4
ravlop3 MOVEQ #32,D3
ravlop2 MOVEQ #16,D2
ravlop1 MOVE.B (A1)+,(A0)+
DBRA D2,ravlop1
ADDQ.L #1,A1
LEA 23(A0),A0
DBRA D3,ravlop2
LEA 8920(A0),A0
DBRA D4,ravlop3
BSR ShowVolSliders
JSR WaitForButtonUp
ravloop BTST #2,$DFF016
BEQ.S ExitVolBox
JSR DoKeyBuffer
MOVE.B RawKeyCode(PC),D2
CMP.B #68,D2
BEQ.S ExitVolBox
BTST #6,$BFE001
BNE.S ravloop
MOVEM.W MouseX,D0-D1
CMP.W #72,D0
BLO.S ravloop
CMP.W #72+136,D0
BHS.S ravloop
CMP.W #155,D1
BLO.S ravloop
CMP.W #166,D1
BLO.S Vol1Slider
CMP.W #177,D1
BLO Vol2Slider
CMP.W #188,D1
BLO VolGadgs
BRA.S ravloop
ExitVolBox
LEA VolBoxPos,A0
MOVEQ #1,D2
revlap3 MOVEQ #32,D1
revlap2 MOVEQ #16,D0
revlap1 CLR.B (A0)+
DBRA D0,revlap1
LEA 23(A0),A0
DBRA D1,revlap2
LEA 8920(A0),A0
DBRA D2,revlap3
BRA DisplaySample
Vol1Slider
CMP.W #167,D0
BHI.S v1skip
LEA Vol1(PC),A4
MOVEQ #0,D7
v1loop1 BTST #6,$BFE001
BNE ravloop
MOVE.W MouseX(PC),D0
CMP.W D7,D0
BEQ.S v1loop1
MOVE.W D0,D7
SUB.W #107,D0
BPL.S v1skp2
MOVEQ #0,D0
v1skp2 CMP.W #60,D0
BLS.S v1skp3
MOVEQ #60,D0
v1skp3 MULU #200,D0
DIVU #60,D0
MOVE.W D0,(A4)
shvosl BSR ShowVolSliders
BRA.S v1loop1
v1skip MOVE.W #180,LineCurX
MOVE.W #164,LineCurY
MOVE.W #6342,TextOffset
BSR GetDec3Dig
TST.W AbortDecFlag
BNE shvosl
CMP.W #200,D0
BLS.S v1sk2
MOVE.W #200,D0
v1sk2 MOVE.W D0,Vol1
BRA.S shvosl
Vol2Slider
CMP.W #167,D0
BHI.S v2skip
LEA Vol2(PC),A4
MOVEQ #0,D7
BRA v1loop1
v2skip MOVE.W #180,LineCurX
MOVE.W #175,LineCurY
MOVE.W #6782,TextOffset
BSR GetDec3Dig
TST.W AbortDecFlag
BNE shvosl
CMP.W #200,D0
BLS.S v2sk2
MOVE.W #200,D0
v2sk2 MOVE.W D0,Vol2
BRA shvosl
VolGadgs
CMP.W #100,D0
BLO DoRampVol
CMP.W #144,D0
BLO Normalize
CMP.W #154,D0
BLO.S SetRampDown
CMP.W #164,D0
BLO.S SetRampUp
CMP.W #174,D0
BLO.S SetRampUnity
BRA ExitVolBox
SetRampDown
MOVE.W #100,Vol1
CLR.W Vol2
BRA.S sru2
SetRampUp
CLR.W Vol1
MOVE.W #100,Vol2
BRA.S sru2
SetRampUnity
MOVE.W #100,Vol1
MOVE.W #100,Vol2
sru2 BSR.S ShowVolSliders
JSR WaitForButtonUp
BRA ravloop
ShowVolSliders
MOVE.L TextBplPtr(PC),A0
LEA 6209(A0),A0
MOVEQ #21,D3
ravlip2 MOVEQ #12,D2
ravlip1 CLR.B (A0)+
DBRA D2,ravlip1
LEA 27(A0),A0
DBRA D3,ravlip2
MOVEQ #0,D4
MOVE.W Vol1(PC),D4
MOVEQ #20,D5
BSR OneSlider
MOVEQ #0,D4
MOVE.W Vol2(PC),D4
MOVEQ #31,D5
BSR OneSlider
MOVE.W Vol1(PC),WordNumber
MOVE.W #6342,TextOffset
BSR Print3DecDigits
MOVE.W Vol2(PC),WordNumber
MOVE.W #6782,TextOffset
BRA Print3DecDigits
OneSlider
MOVE.W D4,D6
ADD.W D4,D4
ADD.W D6,D4
DIVU #10,D4
ADD.W #105,D4
MOVEQ #2,D6
oneslop MOVE.W D4,D0
MOVE.W D4,D2
ADDQ.W #5,D2
MOVE.W D5,D1
MOVE.W D5,D3
BSR DrawLine
ADDQ.W #1,D5
DBRA D6,oneslop
RTS
DoRampVol
CLR.B RawKeyCode
LEA SamplePtrs(PC),A0
MOVE.W InsNum(PC),D1
BEQ nozerr1
LSL.W #2,D1
LEA (A0,D1.W),A0
MOVEQ #0,D2
MOVE.L (A0),D0
BEQ nozerr2
MOVE.L D0,A2
MOVE.L 124(A0),D2
BEQ nozerr2
MOVE.L MarkStartOfs(PC),D0
BMI drvskip
MOVE.L MarkEndOfs(PC),D1
SUB.L D0,D1
BEQ.S drvskip
ADD.L D0,A2
MOVE.L D1,D2
ADDQ.L #1,D2
drvskip JSR StorePtrCol
JSR SetWaitPtrCol
MOVE.L D2,D5
MOVEQ #0,D3
drvloop MOVE.W D3,D1
MULU Vol2(PC),D1
DIVU D2,D1
MOVE.W D2,D4
SUB.W D3,D4
MULU Vol1(PC),D4
DIVU D2,D4
ADD.W D4,D1
ADDQ.W #1,D3
MOVE.B (A2),D0
EXT.W D0
MULS D1,D0
DIVS #100,D0
CMP.W #127,D0
BLT.S drvskp2
MOVEQ #127,D0
drvskp2 CMP.W #-128,D0
BGT.S drvskp3
MOVEQ #-128,D0
drvskp3 MOVE.B D0,(A2)+
SUBQ.L #1,D5
BNE drvloop
JSR RestorePtrCol
BRA ExitVolBox
nozerr1 BSR NotSampleNull
BRA ravloop
nozerr2 BSR EmptySampleError
BRA ravloop
Normalize
CLR.B RawKeyCode
LEA SamplePtrs(PC),A0
MOVE.W InsNum(PC),D1
BEQ nozerr1
LSL.W #2,D1
LEA (A0,D1.W),A0
MOVEQ #0,D2
MOVE.L (A0),D0
BEQ nozerr2
MOVE.L D0,A2
MOVE.L 124(A0),D2
BEQ nozerr2
MOVE.L MarkStartOfs(PC),D0
BMI nozskip
MOVE.L MarkEndOfs(PC),D1
SUB.L D0,D1
BEQ.S nozskip
ADD.L D0,A2
MOVE.L D1,D2
ADDQ.L #1,D2
nozskip JSR StorePtrCol
JSR SetWaitPtrCol
MOVEQ #0,D0
nozloop MOVE.B (A2)+,D1
EXT.W D1
BPL.S nozskp2
NEG.W D1
nozskp2 CMP.W D0,D1
BLO.S nozskp3
MOVE.W D1,D0
nozskp3 SUBQ.L #1,D2
BNE nozloop
JSR RestorePtrCol
TST.W D0
BEQ SetRampUnity
CMP.W #127,D0
BHI SetRampUnity
CMP.W #64,D0
BLO.S nozmax
MOVE.L #12700,D1
DIVU D0,D1
MOVE.W D1,Vol1
MOVE.W D1,Vol2
BRA sru2
nozmax MOVE.W #200,Vol1
MOVE.W #200,Vol2
BRA sru2
Vol1 dc.w 100
Vol2 dc.w 100
TuningTone
JSR WaitForButtonUp
CLR.B RawKeyCode
TST.W TToneFlag
BNE TToneOff
MOVE.W #1,TToneFlag
MOVE.W PattCurPos,D2
DIVU #6,D2
ADDQ.W #1,D2
AND.W #3,D2
MOVEQ #1,D0
LSL.W D2,D0
MOVE.W D0,TToneBit
LEA $DFF0A0,A0
LSL.W #4,D2
LEA (A0,D2.W),A0
LEA PeriodTable(PC),A1
MOVE.W TuneNote,D1
LSL.W #1,D1
MOVE.W (A1,D1.W),D1
LEA TToneData,A2
MOVE.W D0,$DFF096 ; DMACON
MOVE.L A2,(A0)
MOVE.W #16,4(A0) ; 32 bytes
MOVE.W D1,6(A0)
MOVE.W TToneVol,8(A0)
MOVE.W DMAWait,D2
ttowait DBRA D2,ttowait
BSET #15,D0
MOVE.W D0,$DFF096
RTS
TToneOff
CLR.W TToneFlag
MOVE.W TToneBit(PC),$DFF096
RTS
TToneFlag dc.w 0
TToneBit dc.w 0
SamplePressed
CMP.W #144,D1
BHS.S spruskp
MOVE.W LoopStartPos(PC),D2
BEQ.S sprusk5
SUBQ.W #3,D2
CMP.W D2,D0
BLT.S sprusk5
ADDQ.W #4,D2
CMP.W D2,D0
BLO LoopStartDrag
sprusk5 MOVE.W LoopEndPos(PC),D2
BEQ.S spruskp
SUBQ.W #3,D2
CMP.W D2,D0
BLT.S spruskp
ADDQ.W #4,D2
CMP.W D2,D0
BLO LoopEndDrag
spruskp CMP.W #3,D0
BLO Return2
CMP.W #317,D0
BHS Return2
MOVE.W D0,LastSamPos
BSR InvertRange
MOVE.W LastSamPos(PC),D0
MOVE.W D0,MarkStart
MOVE.W D0,MarkEnd
BSR InvertRange
BSR MarkToOffset
MOVE.L MarkEndOfs(PC),SamplePos
BSR ShowPos
sprulop BTST #6,$BFE001
BNE spruend
MOVE.W MouseX(PC),D0
CMP.W #3,D0
BLO sprusk3
CMP.W #317,D0
BHS sprusk2
BRA sprusk4
sprusk2 MOVE.W #316,D0
BRA sprusk4
sprusk3 MOVEQ #3,D0
sprusk4 CMP.W LastSamPos(PC),D0
BEQ sprulop
MOVE.W D0,LastSamPos
BSR InvertRange
MOVE.W LastSamPos(PC),MarkEnd
BSR InvertRange
BSR MarkToOffset
MOVE.L MarkEndOfs(PC),SamplePos
BSR ShowPos
BRA sprulop
spruend MOVE.W MarkStart(PC),D0
MOVE.W MarkEnd(PC),D1
CMP.W D0,D1
BHS MarkToOffset
MOVE.W D0,MarkEnd
MOVE.W D1,MarkStart
BRA MarkToOffset
InvertRange
MOVE.W MarkStart(PC),D4
BEQ Return2
MOVE.W MarkEnd(PC),D5
MOVE.L GfxBase(PC),A6
JSR LVOOwnBlitter(A6)
JSR LVOWaitBlit(A6)
invran3 MOVE.W D4,D0
MOVEQ #0,D1
MOVE.W D4,D2
MOVEQ #64,D3
BSR DrawInvertLine
CMP.W D5,D4
BEQ invranx
BHI invran2
ADDQ.W #1,D4
BRA invran3
invran2 SUBQ.W #1,D4
BRA invran3
invranx MOVE.L GfxBase(PC),A6
JSR LVODisownBlitter(A6)
RTS
LoopStartPos dc.w 0
LoopEndPos dc.w 0
LoopStartDrag
CLR.W DragType
LopDrgLop
MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D0
BEQ Return2
MULU #30,D0
LEA 12(A0,D0.W),A0
MOVE.W MouseX(PC),D0
lsdlop1 BTST #6,$BFE001
BNE lsdexit
MOVE.W MouseX(PC),D1
CMP.W D0,D1
BEQ.S lsdlop1
SUB.W DragType,D1
BPL.S lsdmsk1
MOVEQ #0,D1
lsdmsk1 CMP.W #314,D1
BLO.S lsdmsk2
MOVE.W #314,D1
lsdmsk2 MOVE.L SamDisplay(PC),D0
MULU D0,D1
DIVU #314,D1
MOVE.L SamOffset(PC),D0
ADD.W D1,D0 ; new repeat
BCLR #0,D0
MOVEQ #0,D1
MOVE.W 4(A0),D1 ; old repeat
ADD.W D1,D1
TST.W DragType
BNE.S drgrepl
MOVE.W D1,D3
SUB.W D1,D0 ; offset
ADD.W D0,D1
MOVE.W 6(A0),D2
ADD.W D2,D2
ADD.W D2,D3
SUBQ.W #2,D3
SUB.W D0,D2
CMP.W D3,D1
BLS.S lsdok
MOVE.W D3,D1
MOVEQ #2,D2
lsdok LSR.W #1,D1
MOVE.W D1,4(A0)
LSR.W #1,D2
MOVE.W D2,6(A0)
BSR.S lsdexit
BRA LopDrgLop
lsdexit BSR ShowSampleInfo
BSR UpdateRepeats
BRA SetLoopSprites2
LoopEndDrag
MOVE.W #3,DragType
BRA LopDrgLop
drgrepl MOVE.L D0,D2 ; repend
SUB.L D1,D2 ; subtract repstart
CMP.L #2,D2
BGT.S ledskp1
MOVEQ #2,D2
BRA.S lsdok
ledskp1 MOVE.W D1,D0 ; repeat
ADD.W D2,D0 ; + replen
MOVE.W (A0),D3
ADD.W D3,D3
CMP.W D3,D0
BLS.S lsdok
SUB.W D1,D3
MOVE.W D3,D2
BRA.S lsdok
DragType dc.w 0
SamDragBar
CMP.W #4,D0
BLO Return2
CMP.W #316,D0
BHS Return2
CMP.W DragStart(PC),D0
BLO.S draglo
CMP.W DragEnd(PC),D0
BHI.S draghi
MOVE.W MouseX(PC),D0
MOVE.W D0,D1
SUB.W DragStart(PC),D1
MOVE.W D1,SaveMX
sdrlop1 BTST #6,$BFE001
BNE Return2
MOVE.W MouseX(PC),D1
CMP.W D0,D1
BEQ.S sdrlop1
SUB.W SaveMX(PC),D0
SUBQ.W #4,D0
BPL.S sdrskp1
MOVEQ #0,D0
sdrskp1 MOVE.L SamLength(PC),D1
BEQ Return2
MULU D1,D0
DIVU #311,D0
AND.L #$FFFF,D0
BSR dragchk
MOVE.W MouseX(PC),D0
BRA.S sdrlop1
draglo MOVE.L SamOffset(PC),D0
SUB.L SamDisplay(PC),D0
BPL.S draglo2
MOVEQ #0,D0
draglo2 CMP.L SamOffset(PC),D0
BEQ Return2
MOVE.L D0,SamOffset
BRA DisplaySample
draghi MOVE.L SamOffset(PC),D0
ADD.L SamDisplay(PC),D0
dragchk MOVE.L D0,D1
ADD.L SamDisplay(PC),D1
CMP.L SamLength(PC),D1
BLS.S draglo2
MOVE.L SamLength(PC),D0
SUB.L SamDisplay(PC),D0
BRA.S draglo2
SaveMX dc.w 0
;----
MarkToOffset
MOVE.L SamDisplay(PC),D0
MOVE.W MarkStart(PC),D1
BEQ Return2
SUBQ.W #3,D1
MULU D0,D1
DIVU #314,D1
AND.L #$FFFF,D1
ADD.L SamOffset(PC),D1
MOVE.L D1,MarkStartOfs
MOVE.W MarkEnd(PC),D1
CMP.W #316,D1
BLO.S mtosome
MOVE.L SamOffset(PC),D1
ADD.L D0,D1
BRA.S mtoexit
mtosome SUBQ.W #3,D1
MULU D0,D1
DIVU #314,D1
AND.L #$FFFF,D1
ADD.L SamOffset(PC),D1
mtoexit MOVE.L D1,MarkEndOfs
RTS
OffsetToMark
MOVE.L MarkStartOfs(PC),D0
BMI.S otmout
MOVE.W #3,MarkStart
SUB.L SamOffset(PC),D0
BMI.S otmskip ; set to start if before offset
MULU #314,D0
MOVE.L SamDisplay(PC),D1
BEQ.S otmskip
DIVU D1,D0
CMP.W #314,D0
BHI.S otmout ; if start after display
ADD.W D0,MarkStart
otmskip MOVE.W #3,MarkEnd
MOVE.L MarkEndOfs(PC),D0
SUB.L SamOffset(PC),D0
BMI.S otmout ; if end before offset
MULU #314,D0
MOVE.L SamDisplay(PC),D1
BEQ Return2
DIVU D1,D0
CMP.W #313,D0
BLS.S otmok
MOVE.W #313,D0 ; set to end if after display
otmok ADD.W D0,MarkEnd
RTS
otmout CLR.W MarkStart
RTS
SamScrEnable dc.w 0
SamMemPtr dc.l 0
SamMemSize dc.l 0
LastSamPos dc.w 0
MarkStart dc.w 0
MarkEnd dc.w 0
MarkStartOfs dc.l 0
MarkEndOfs dc.l 0
;---- Sample graphing stuff ----
DisplaySample
TST.W SamScrEnable
BEQ Return2
BSR rdsdoit
TST.L MarkStartOfs
BMI Return2
BSR OffsetToMark
BRA InvertRange
RedrawSample
TST.W SamScrEnable
BEQ Return2
MOVEQ #-1,D0
MOVE.L D0,MarkStartOfs
CLR.W MarkStart
MOVE.W InsNum(PC),D0
BEQ rdsblnk
LEA SampleStarts(PC),A1
SUBQ.W #1,D0
LSL.W #2,D0
MOVE.L (A1,D0.W),SamStart
BEQ rdsblnk
MOVE.L 124(A1,D0.W),D1
BEQ rdsblnk
MOVE.L D1,SamLength
CLR.L SamOffset
MOVE.L D1,SamDisplay
BRA rdsdoit
rdsblnk LEA BlankSample,A0
MOVE.L A0,SamStart
MOVE.L #314,SamLength
CLR.L SamOffset
MOVE.L #314,SamDisplay
rdsdoit MOVE.L GfxBase(PC),A6
JSR LVOOwnBlitter(A6)
JSR LVOWaitBlit(A6)
BSR ClearSamArea
MOVE.L SamStart(PC),A0
MOVEQ #0,D4
MOVE.L SamOffset(PC),D5
MOVE.L SamDisplay(PC),D6
MOVE.L D5,D7
MOVE.L A0,D0
ADD.L D5,D0
MOVE.L D0,SamDrawStart
ADD.L D6,D0
MOVE.L D0,SamDrawEnd
rdsloop MOVE.W D4,D0
ADDQ.W #3,D0
MOVEQ #127,D1
SUB.B (A0,D7.L),D1
LSR.W #2,D1
TST.W D4
BNE rdsdraw
BSR MoveTo
BRA rdsupdt
rdsdraw BSR DrawTo
rdsupdt ADDQ.W #1,D4
MOVE.L D4,D7
MULU D6,D7
DIVU #314,D7
AND.L #$FFFF,D7
ADD.L D5,D7
CMP.W #314,D4
BLO rdsloop
MOVE.L GfxBase(PC),A6
JSR LVODisownBlitter(A6)
BSR.S SetDragBar
MOVE.L SamDisplay(PC),D0
LEA BlankSample,A0
CMP.L SamStart,A0
BNE.S rdsslwo
MOVEQ #0,D0
rdsslwo MOVE.W #215*40+33,TextOffset
BSR Print6DecDigits
BRA SetLoopSprites
SamStart dc.l 0
SamLength dc.l 0
SamOffset dc.l 0
SamDisplay dc.l 0
SavSamIns dc.w 0
SetDragBar
MOVE.W #4*10-1,D0
MOVE.L TextBplPtr,A0
LEA $15B8+2720(A0),A0
MOVEQ #0,D1
sdblop2 MOVE.L D1,(A0)+
DBRA D0,sdblop2
MOVE.L SamLength(PC),D0
BEQ Return2
MOVE.L SamOffset(PC),D4
MOVE.L SamDisplay(PC),D5
CMP.L D0,D5
BEQ Return2
ADD.L D4,D5
MULU #311,D4
DIVU D0,D4
ADDQ.W #4,D4
MOVE.W D4,DragStart
MULU #311,D5
DIVU D0,D5
ADDQ.W #5,D5
MOVE.W D5,DragEnd
MOVE.L GfxBase(PC),A6
JSR LVOOwnBlitter(A6)
JSR LVOWaitBlit(A6)
MOVEQ #68,D6
MOVEQ #3,D7
sdbloop MOVE.W D4,D0
MOVE.L D6,D1
MOVE.W D5,D2
MOVE.L D6,D3
BSR.S DrawLine
ADDQ.L #1,D6
DBRA D7,sdbloop
MOVE.L GfxBase(PC),A6
JSR LVODisownBlitter(A6)
RTS
DragStart dc.w 0
DragEnd dc.w 0
;---- Line Routine ----
DrawInvertLine
MOVE.B #$48,MinTerm
BSR.S DrawLine
MOVE.B #$C8,Minterm
RTS
MoveTo MOVE.W D0,PenX
MOVE.W D1,PenY
RTS
DrawTo MOVE.W PenX(PC),D2
MOVE.W PenY(PC),D3
MOVE.W D0,PenX
MOVE.W D1,PenY
DrawLine
MOVEM.L D4-D7,-(SP)
MOVEQ #0,D4
SUB.W D1,D3
BGE.S dypos
NEG.W D3
BRA.S dyneg
dypos BSET #0,D4
dyneg SUB.W D0,D2
BGE.S dxpos
NEG.W D2
BRA.S dxneg
dxpos BSET #1,D4
dxneg MOVE.W D2,D5
SUB.W D3,D5
BGE.S dxdypos
EXG D2,D3
BRA.S dxdyneg
dxdypos BSET #2,D4
dxdyneg MOVEQ #0,D5
ROR.W #4,D0
OR.W #$0B00,D0
MOVE.B D0,D5
MOVE.B MinTerm(PC),D0
LSL.W #1,D5
MULS #ScrWidth,D1
ADD.W D5,D1
ADD.L LineScreen(PC),D1
blitrdy BTST #14,$DFF002 ; DMACONR
BNE.S blitrdy
MOVE.W $DFF01C,-(SP)
BSET #7,(SP)
MOVE.W #$7FFF,$DFF09A
MOVE.B Octants(PC,D4),D4
ADD.L D3,D3
MOVE.W D3,$DFF062 ; BLTBMOD
SUB.W D2,D3
BGE.S dldspos
OR.B #$40,D4
dldspos MOVE.L D3,$DFF050 ; BLTAPTR
SUB.W D2,D3
MOVE.W D3,$DFF064 ; BLTAMOD
MOVE.W D4,$DFF042 ; BLTCON1
MOVE.W D0,$DFF040 ; BLTCON0
MOVE.L D1,$DFF048 ; BLTCPTR
MOVE.L D1,$DFF054 ; BLTDPTR
MOVE.W #ScrWidth,$DFF060 ; BLTCMOD
MOVE.W #ScrWidth,$DFF066 ; BLTDMOD
MOVE.W #$8000,$DFF074 ; BLTADAT
MOVE.W #$FFFF,$DFF044 ; BLTAFWM
MOVE.W LinMask(PC),$DFF072 ; BLTBDAT
ASL.W #6,D2
ADD.W #2,D2
MOVE.W D2,$DFF058 ; BLTSIZE
MOVE.W (SP)+,$DFF09A
MOVEM.L (SP)+,D4-D7
RTS
ScrWidth = 40
Octants dc.b 3*4+1,2*4+1,1*4+1,0*4+1,7*4+1,5*4+1,6*4+1,4*4+1
LinMask dc.w $FFFF
MinTerm dc.b $C8 ;was $CA
dc.b 0 ;free 0
PenX dc.w 0
PenY dc.w 0
LineScreen dc.l 0
;---- Loop Sprites ----
SetLoopSprites
MOVEQ #-1,D6
MOVEQ #-1,D7
MOVE.W InsNum(PC),D0
BEQ slsset
MULU #30,D0
MOVE.L SongDataPtr(PC),A0
LEA 12(A0,D0.W),A0
SetLoopSprites2
TST.W SamScrEnable
BEQ Return2
CLR.W LoopOnOffFlag
MOVEQ #-1,D6
MOVEQ #-1,D7
MOVEQ #0,D0
MOVE.W 4(A0),D0
ADD.L D0,D0
MOVEQ #0,D1
MOVE.W 6(A0),D1
ADD.L D1,D1
MOVE.L D0,D5
ADD.L D1,D5
CMP.W #2,D5
BLS.S slsset
MOVE.W #1,LoopOnOffFlag
MOVE.L SamOffset(PC),D2
MOVE.L SamDisplay(PC),D3
MOVE.L D2,D4
ADD.L D3,D4
CMP.L D2,D0
BLO.S 1$
CMP.L D4,D0
BHI.S 1$
SUB.L D2,D0
MULU #314,D0
DIVU D3,D0
ADDQ.W #3,D0
MOVE.W D0,D6
1$ CMP.L D2,D5
BLO.S slsset
CMP.L D4,D5
BHI.S slsset
SUB.L D2,D5
MULU #314,D5
DIVU D3,D5
ADDQ.W #6,D5
MOVE.W D5,D7
slsset MOVE.W #139,D1
MOVE.W D6,D0
BPL.S 1$
MOVEQ #0,D0
MOVE.W #270,D1
1$ MOVEQ #64,D2
LEA LoopSpriteData1,A0
MOVE.W D0,LoopStartPos
BSR SetSpritePos
MOVE.W #139,D1
MOVE.W D7,D0
BPL.S 2$
MOVEQ #0,D0
MOVE.W #270,D1
2$ MOVEQ #64,D2
LEA LoopSpriteData2,A0
MOVE.W D0,LoopEndPos
BSR SetSpritePos
BRA ShowLoopToggle
;---- Playroutine ----
audchan1temp dc.l 0,0,0,0,0,$00010000,0, 0,0,0,0
audchan2temp dc.l 0,0,0,0,0,$00020000,0, 0,0,0,0
audchan3temp dc.l 0,0,0,0,0,$00040000,0, 0,0,0,0
audchan4temp dc.l 0,0,0,0,0,$00080000,0, 0,0,0,0
IntMusic
MOVEM.L D0-D7/A0-A6,-(SP)
MOVE.L RunMode(PC),D0
BEQ NoNewPositionYet
CMP.L #'patt',D0
BEQ.S 1$
MOVE.L SongPosition(PC),CurrPos
1$ MOVE.L SongDataPtr(PC),A0
MOVE.B sd_numofpatt(A0),SongNumOfPatt+1
TST.W StepPlayEnable
BNE.S 2$
ADDQ.L #1,Counter
MOVE.L Counter(PC),D0
CMP.L CurrSpeed(PC),D0
BLO.S NoNewNote
2$ CLR.L Counter
TST.B PattDelayTime2
BEQ.S GetNewNote
BSR.S NoNewAllChannels
BRA dskip
NoNewNote
BSR.S NoNewAllChannels
BRA NoNewPositionYet
NoNewAllChannels
LEA audchan1toggle,A4
LEA audchan1temp(PC),A6
LEA $DFF0A0,A5
BSR CheckEffects
LEA audchan2toggle,A4
LEA audchan2temp(PC),A6
LEA $DFF0B0,A5
BSR CheckEffects
LEA audchan3toggle,A4
LEA audchan3temp(PC),A6
LEA $DFF0C0,A5
BSR CheckEffects
LEA audchan4toggle,A4
LEA audchan4temp(PC),A6
LEA $DFF0D0,A5
BRA CheckEffects
GetNewNote
LEA 12(A0),A3
LEA sd_pattpos(A0),A2
LEA sd_patterndata(A0),A0
MOVEQ #0,D1
MOVE.L SongPosition(PC),D0
MOVE.B (A2,D0.W),D1
CMP.L #'patt',RunMode
BNE.S 1$
MOVE.L PatternNumber(PC),D1
1$ ASL.L #8,D1
ASL.L #2,D1
ADD.L PatternPosition(PC),D1
MOVE.L D1,PatternPtr
CLR.W DMACONtemp
LEA audchan1toggle,A4
LEA $DFF0A0,A5
LEA audchan1temp(PC),A6
MOVEQ #1,D2
BSR PlayVoice
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5)
LEA audchan2toggle,A4
LEA $DFF0B0,A5
LEA audchan2temp(PC),A6
MOVEQ #2,D2
BSR.S PlayVoice
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5)
LEA audchan3toggle,A4
LEA $DFF0C0,A5
LEA audchan3temp(PC),A6
MOVEQ #3,D2
BSR.S PlayVoice
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5)
LEA audchan4toggle,A4
LEA $DFF0D0,A5
LEA audchan4temp(PC),A6
MOVEQ #4,D2
BSR.S PlayVoice
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5)
BRA SetDMA
CheckMetronome
CMP.B MetroChannel,D2
BNE Return2
MOVE.B MetroSpeed,D2
BEQ Return2
MOVE.L PatternPosition,D3
LSR.L #4,D3
DIVU D2,D3
SWAP D3
TST.W D3
BNE Return2
AND.L #$00000FFF,(A6)
OR.L #$10D6F000,(A6) ; Play sample $1F at period $0D6 (214)
RTS
PlayVoice
TST.L (A6)
BNE.S plvskip
BSR PerNop
plvskip MOVE.L (A0,D1.L),(A6) ; Read note from pattern
BSR.S CheckMetronome
ADDQ.L #4,D1
MOVEQ #0,D2
MOVE.B n_cmd(A6),D2 ; Get lower 4 bits of instrument
AND.B #$F0,D2
LSR.B #4,D2
MOVE.B (A6),D0 ; Get higher 4 bits of instrument
AND.B #$F0,D0
OR.B D0,D2
TST.B D2
BEQ SetRegisters ; Instrument was zero
MOVEQ #0,D3
LEA SampleStarts(PC),A1
MOVE D2,D4
MOVE.B D2,n_samplenum(A6)
SUBQ.L #1,D2
LSL.L #2,D2
MULU #30,D4
MOVE.L (A1,D2.L),n_start(A6)
MOVE.W (A3,D4.L),n_length(A6)
MOVE.W (A3,D4.L),n_reallength(A6)
MOVE.B 2(A3,D4.L),n_finetune(A6)
MOVE.B 3(A3,D4.L),n_volume(A6)
MOVE.W 4(A3,D4.L),D3 ; Get repeat
TST.W D3
BEQ.S NoLoop
MOVE.L n_start(A6),D2 ; Get start
ASL.W #1,D3
ADD.L D3,D2 ; Add repeat
MOVE.L D2,n_loopstart(A6)
MOVE.L D2,n_wavestart(A6)
MOVE.W 4(A3,D4.L),D0 ; Get repeat
ADD.W 6(A3,D4.L),D0 ; Add replen
MOVE.W D0,n_length(A6)
MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen
BRA.S SetRegisters
NoLoop MOVE.L n_start(A6),D2
ADD.L D3,D2
MOVE.L D2,n_loopstart(A6)
MOVE.L D2,n_wavestart(A6)
MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen
SetRegisters
MOVE.W (A6),D0
AND.W #$0FFF,D0
BEQ CheckMoreEffects ; If no note
MOVE.W 2(A6),D0
AND.W #$0FF0,D0
CMP.W #$0E50,D0 ; finetune
BEQ.S DoSetFineTune
MOVE.B 2(A6),D0
AND.B #$0F,D0
CMP.B #3,D0 ; TonePortamento
BEQ.S ChkTonePorta
CMP.B #5,D0 ; TonePortamento + VolSlide
BEQ.S ChkTonePorta
CMP.B #9,D0 ; Sample Offset
BNE.S SetPeriod
BSR CheckMoreEffects
BRA.S SetPeriod
DoSetFineTune
BSR SetFineTune
BRA.S SetPeriod
ChkTonePorta
BSR SetTonePorta
BRA CheckMoreEffects
SetPeriod
MOVEM.L D0-D1/A0-A1,-(SP)
MOVE.W (A6),D1
AND.W #$0FFF,D1
LEA PeriodTable(PC),A1
MOVEQ #0,D0
MOVEQ #$24,D7
ftuloop CMP.W (A1,D0.W),D1
BHS ftufound
ADDQ.L #2,D0
DBRA D7,ftuloop
ftufound
MOVEQ #0,D1
MOVE.B n_finetune(A6),D1
MULU #37*2,D1
ADD.L D1,A1
MOVE.W (A1,D0.W),n_period(A6)
MOVEM.L (SP)+,D0-D1/A0-A1
MOVE.W 2(A6),D0
AND.W #$0FF0,D0
CMP.W #$0ED0,D0
BEQ CheckMoreEffects
MOVE.W n_dmabit(A6),$DFF096
BTST #2,n_wavecontrol(A6)
BNE vibnoc
CLR.B n_vibratopos(A6)
vibnoc BTST #6,n_wavecontrol(A6)
BNE trenoc
CLR.B n_tremolopos(A6)
trenoc MOVE.W n_length(A6),4(A5) ; Set length
MOVE.L n_start(A6),(A5) ; Set start
BNE sdmaskp
CLR.L n_loopstart(A6)
MOVEQ #1,D0
MOVE.W D0,4(A5)
MOVE.W D0,n_replen(A6)
sdmaskp MOVE.W n_period(A6),D0
MOVE.W D0,6(A5) ; Set period
JSR SpectrumAnalyzer ; Do the analyzer
ST n_trigger(A6)
MOVE.W n_dmabit(A6),D0
OR.W D0,DMACONtemp
BRA CheckMoreEffects
SetDMA MOVE.W DMAWait,D0
WaitDMA DBRA D0,WaitDMA
MOVE.W DMACONtemp,D0
AND.W ActiveChannels,D0
OR.W #$8000,D0
MOVE.W D0,$DFF096
MOVE.W DMAWait,D0
WaitDMA2
DBRA D0,WaitDMA2
LEA $DFF000,A5
LEA audchan4temp(PC),A6
MOVE.L n_loopstart(A6),$D0(A5)
MOVE.W n_replen(A6),$D4(A5)
LEA audchan3temp(PC),A6
MOVE.L n_loopstart(A6),$C0(A5)
MOVE.W n_replen(A6),$C4(A5)
LEA audchan2temp(PC),A6
MOVE.L n_loopstart(A6),$B0(A5)
MOVE.W n_replen(A6),$B4(A5)
LEA audchan1temp(PC),A6
MOVE.L n_loopstart(A6),$A0(A5)
MOVE.W n_replen(A6),$A4(A5)
dskip TST.L RunMode
BEQ dskipx
BSR SetPatternPos
dskipx MOVE.L PatternPosition(PC),D0
LSR.L #4,D0
MOVE.W D0,ScrPattPos
ADD.L #16,PatternPosition
MOVE.B PattDelayTime,D0
BEQ dskpc
MOVE.B D0,PattDelayTime2
CLR.B PattDelayTime
dskpc TST.B PattDelayTime2
BEQ dskpa
SUBQ.B #1,PattDelayTime2
BEQ dskpa
SUB.L #16,PatternPosition
dskpa TST.B PBreakFlag
BEQ nnpysk
SF PBreakFlag
MOVEQ #0,D0
MOVE.B PBreakPosition(PC),D0
LSL.W #4,D0
MOVE.L D0,PatternPosition
CLR.B PBreakPosition
nnpysk TST.W StepPlayEnable
BEQ nnpysk2
BSR DoStopIt
CLR.W StepPlayEnable
MOVE.L PatternPosition(PC),D0
LSR.L #4,D0
AND.W #63,D0
MOVE.W D0,ScrPattPos
nnpysk2 CMP.L #1024,PatternPosition
BNE NoNewPositionYet
NextPosition
MOVEQ #0,D0
MOVE.B PBreakPosition(PC),D0
LSL.W #4,D0
MOVE.L D0,PatternPosition
CLR.B PBreakPosition
CLR.B PosJumpAssert
CMP.L #'patp',RunMode
BNE NoNewPositionYet
ADDQ.L #1,SongPosition
AND.L #$7F,SongPosition
MOVE.L SongPosition(PC),D1
MOVE.L SongDataPtr(PC),A0
CMP.B sd_numofpatt(A0),D1
BLO NoNewPositionYet
CLR.L SongPosition
TST.W StepPlayEnable
BEQ NoNewPositionYet
BSR DoStopIt
CLR.W StepPlayEnable
MOVE.L PatternPosition(PC),D0
LSR.L #4,D0
MOVE.W D0,ScrPattPos
NoNewPositionYet
TST.B PosJumpAssert
BNE NextPosition
MOVEM.L (SP)+,D0-D7/A0-A6
RTS
CheckEffects
TST.W (A4)
BEQ Return2
BSR chkefx2
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5)
RTS
chkefx2 BSR UpdateFunk
MOVE.W n_cmd(A6),D0
AND.W #$0FFF,D0
BEQ Return2
MOVE.B n_cmd(A6),D0
AND.B #$0F,D0
TST.B D0
BEQ Arpeggio
CMP.B #1,D0
BEQ PortaUp
CMP.B #2,D0
BEQ PortaDown
CMP.B #3,D0
BEQ TonePortamento
CMP.B #4,D0
BEQ Vibrato
CMP.B #5,D0
BEQ TonePlusVolSlide
CMP.B #6,D0
BEQ VibratoPlusVolSlide
CMP.B #$E,D0
BEQ E_Commands
SetBack MOVE.W n_period(A6),6(A5)
CMP.B #7,D0
BEQ Tremolo
CMP.B #$A,D0
BEQ VolumeSlide
Return2 RTS
PerNop MOVE.W n_period(A6),6(A5)
RTS
Arpeggio
MOVEQ #0,D0
MOVE.L Counter(PC),D0
DIVS #3,D0
SWAP D0
CMP.W #1,D0
BEQ Arpeggio1
CMP.W #2,D0
BEQ Arpeggio2
Arpeggio0
MOVE.W n_period(A6),D2
BRA ArpeggioSet
Arpeggio1
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
LSR.B #4,D0
BRA ArpeggioFind
Arpeggio2
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #15,D0
ArpeggioFind
ASL.W #1,D0
MOVEQ #0,D1
MOVE.B n_finetune(A6),D1
MULU #37*2,D1
LEA PeriodTable(PC),A0
ADD.L D1,A0
MOVEQ #0,D1
MOVE.W n_period(A6),D1
MOVEQ #$24,D7
arploop MOVE.W (A0,D0.W),D2
CMP.W (A0),D1
BHS ArpeggioSet
ADDQ.L #2,A0
DBRA D7,arploop
RTS
ArpeggioSet
MOVE.W D2,6(A5)
RTS
FinePortaUp
TST.L Counter
BNE Return2
MOVE.B #$0F,LowMask
PortaUp MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B LowMask,D0
MOVE.B #$FF,LowMask
SUB.W D0,n_period(A6)
MOVE.W n_period(A6),D0
AND.W #$0FFF,D0
CMP.W #$0071,D0
BPL PortaUskip
AND.W #$F000,n_period(A6)
OR.W #$0071,n_period(A6)
PortaUskip MOVE.W n_period(A6),D0
AND.W #$0FFF,D0
MOVE.W D0,6(A5)
RTS
FinePortaDown
TST.L Counter
BNE Return2
MOVE.B #$0F,LowMask
PortaDown
CLR.W D0
MOVE.B n_cmdlo(A6),D0
AND.B LowMask,D0
MOVE.B #$FF,LowMask
ADD.W D0,n_period(A6)
MOVE.W n_period(A6),D0
AND.W #$0FFF,D0
CMP.W #$0358,D0
BMI PortaDskip
AND.W #$F000,n_period(A6)
OR.W #$0358,n_period(A6)
PortaDskip MOVE.W n_period(A6),D0
AND.W #$0FFF,D0
MOVE.W D0,6(A5)
RTS
SetTonePorta
MOVE.L A0,-(SP)
MOVE.W (A6),D2
AND.W #$0FFF,D2
MOVEQ #0,D0
MOVE.B n_finetune(A6),D0
MULU #37*2,D0
LEA PeriodTable(PC),A0
ADD.L D0,A0
MOVEQ #0,D0
StpLoop CMP.W (A0,D0.W),D2
BHS StpFound
ADDQ.W #2,D0
CMP.W #37*2,D0
BLO StpLoop
MOVEQ #35*2,D0
StpFound
MOVE.B n_finetune(A6),D2
AND.B #8,D2
BEQ StpGoss
TST.W D0
BEQ StpGoss
SUBQ.W #2,D0
StpGoss MOVE.W (A0,D0.W),D2
MOVE.L (SP)+,A0
MOVE.W D2,n_wantedperiod(A6)
MOVE.W n_period(A6),D0
CLR.B n_toneportdirec(A6)
CMP.W D0,D2
BEQ ClearTonePorta
BGE Return2
MOVE.B #1,n_toneportdirec(A6)
RTS
ClearTonePorta
CLR.W n_wantedperiod(A6)
RTS
TonePortamento
MOVE.B n_cmdlo(A6),D0
BEQ TonePortNoChange
MOVE.B D0,n_toneportspeed(A6)
CLR.B n_cmdlo(A6)
TonePortNoChange
TST.W n_wantedperiod(A6)
BEQ Return2
MOVEQ #0,D0
MOVE.B n_toneportspeed(A6),D0
TST.B n_toneportdirec(A6)
BNE TonePortaUp
TonePortaDown
ADD.W D0,n_period(A6)
MOVE.W n_wantedperiod(A6),D0
CMP.W n_period(A6),D0
BGT TonePortaSetPer
MOVE.W n_wantedperiod(A6),n_period(A6)
CLR.W n_wantedperiod(A6)
BRA TonePortaSetPer
TonePortaUp
SUB.W D0,n_period(A6)
MOVE.W n_wantedperiod(A6),D0
CMP.W n_period(A6),D0
BLT TonePortaSetPer
MOVE.W n_wantedperiod(A6),n_period(A6)
CLR.W n_wantedperiod(A6)
TonePortaSetPer
MOVE.W n_period(A6),D2
MOVE.B n_glissfunk(A6),D0
AND.B #$0F,D0
BEQ GlissSkip
MOVEQ #0,D0
MOVE.B n_finetune(A6),D0
MULU #37*2,D0
LEA PeriodTable(PC),A0
ADD.L D0,A0
MOVEQ #0,D0
GlissLoop
CMP.W (A0,D0.W),D2
BHS GlissFound
ADDQ.W #2,D0
CMP.W #37*2,D0
BLO GlissLoop
MOVEQ #35*2,D0
GlissFound
MOVE.W (A0,D0.W),D2
GlissSkip
MOVE.W D2,6(A5) ; Set period
RTS
Vibrato MOVE.B n_cmdlo(A6),D0
BEQ Vibrato2
MOVE.B n_vibratocmd(A6),D2
AND.B #$0F,D0
BEQ vibskip
AND.B #$F0,D2
OR.B D0,D2
vibskip MOVE.B n_cmdlo(A6),D0
AND.B #$F0,D0
BEQ vibskip2
AND.B #$0F,D2
OR.B D0,D2
vibskip2
MOVE.B D2,n_vibratocmd(A6)
Vibrato2
MOVE.L A4,-(SP)
MOVE.B n_vibratopos(A6),D0
LEA VibratoTable(PC),A4
LSR.W #2,D0
AND.W #$001F,D0
MOVEQ #0,D2
MOVE.B n_wavecontrol(A6),D2
AND.B #$03,D2
BEQ vib_sine
LSL.B #3,D0
CMP.B #1,D2
BEQ vib_rampdown
MOVE.B #255,D2
BRA vib_set
vib_rampdown
TST.B n_vibratopos(A6)
BPL vib_rampdown2
MOVE.B #255,D2
SUB.B D0,D2
BRA vib_set
vib_rampdown2
MOVE.B D0,D2
BRA vib_set
vib_sine
MOVE.B 0(A4,D0.W),D2
vib_set
MOVE.B n_vibratocmd(A6),D0
AND.W #15,D0
MULU D0,D2
LSR.W #7,D2
MOVE.W n_period(A6),D0
TST.B n_vibratopos(A6)
BMI VibratoNeg
ADD.W D2,D0
BRA Vibrato3
VibratoNeg
SUB.W D2,D0
Vibrato3
MOVE.W D0,6(A5)
MOVE.B n_vibratocmd(A6),D0
LSR.W #2,D0
AND.W #$003C,D0
ADD.B D0,n_vibratopos(A6)
MOVE.L (SP)+,A4
RTS
TonePlusVolSlide
BSR TonePortNoChange
BRA VolumeSlide
VibratoPlusVolSlide
BSR Vibrato2
BRA VolumeSlide
Tremolo MOVE.L A4,-(SP)
MOVE.B n_cmdlo(A6),D0
BEQ Tremolo2
MOVE.B n_tremolocmd(A6),D2
AND.B #$0F,D0
BEQ treskip
AND.B #$F0,D2
OR.B D0,D2
treskip MOVE.B n_cmdlo(A6),D0
AND.B #$F0,D0
BEQ treskip2
AND.B #$0F,D2
OR.B D0,D2
treskip2
MOVE.B D2,n_tremolocmd(A6)
Tremolo2
MOVE.B n_tremolopos(A6),D0
LEA VibratoTable(PC),A4
LSR.W #2,D0
AND.W #$001F,D0
MOVEQ #0,D2
MOVE.B n_wavecontrol(A6),D2
LSR.B #4,D2
AND.B #$03,D2
BEQ tre_sine
LSL.B #3,D0
CMP.B #1,D2
BEQ tre_rampdown
MOVE.B #255,D2
BRA tre_set
tre_rampdown
TST.B n_vibratopos(A6)
BPL tre_rampdown2
MOVE.B #255,D2
SUB.B D0,D2
BRA tre_set
tre_rampdown2
MOVE.B D0,D2
BRA tre_set
tre_sine
MOVE.B 0(A4,D0.W),D2
tre_set
MOVE.B n_tremolocmd(A6),D0
AND.W #15,D0
MULU D0,D2
LSR.W #6,D2
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
TST.B n_tremolopos(A6)
BMI TremoloNeg
ADD.W D2,D0
BRA Tremolo3
TremoloNeg
SUB.W D2,D0
Tremolo3
BPL TremoloSkip
CLR.W D0
TremoloSkip
CMP.W #$40,D0
BLS TremoloOk
MOVE.W #$40,D0
TremoloOk
MOVE.W D0,8(A5)
MOVE.B n_tremolocmd(A6),D0
LSR.W #2,D0
AND.W #$003C,D0
ADD.B D0,n_tremolopos(A6)
MOVE.L (SP)+,A4
ADDQ.L #4,SP
RTS
SampleOffset
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
BEQ sononew
MOVE.B D0,n_sampleoffset(A6)
sononew MOVE.B n_sampleoffset(A6),D0
LSL.W #7,D0
CMP.W n_length(A6),D0
BGE sofskip
SUB.W D0,n_length(A6)
LSL.W #1,D0
ADD.L D0,n_start(A6)
RTS
sofskip MOVE.W #$0001,n_length(A6)
RTS
VolumeSlide
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
LSR.B #4,D0
TST.B D0
BEQ VolSlideDown
VolSlideUp
ADD.B D0,n_volume(A6)
CMP.B #$40,n_volume(A6)
BMI vsuskip
MOVE.B #$40,n_volume(A6)
vsuskip MOVE.B n_volume(A6),D0
; MOVE.W D0,8(A5)
RTS
VolSlideDown
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
VolSlideDown2
SUB.B D0,n_volume(A6)
BPL vsdskip
CLR.B n_volume(A6)
vsdskip MOVE.B n_volume(A6),D0
; MOVE.W D0,8(A5)
RTS
PositionJump
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
SUBQ.B #1,D0
MOVE.L D0,SongPosition
pj2 CLR.B PBreakPosition
ST PosJumpAssert
RTS
VolumeChange
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
CMP.B #$40,D0
BLS VolumeOk
MOVEQ #$40,D0
VolumeOk
MOVE.B D0,n_volume(A6)
; MOVE.W D0,8(A5)
RTS
PatternBreak
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
MOVE.L D0,D2
LSR.B #4,D0
MULU #10,D0
AND.B #$0F,D2
ADD.B D2,D0
CMP.B #63,D0
BHI pj2
MOVE.B D0,PBreakPosition
ST PosJumpAssert
RTS
SetSpeed
MOVE.B 3(A6),D0
AND.W #$FF,D0
BEQ.S SpeedNull
TST.B IntMode
BEQ.S normspd
CMP.W #32,D0
BLO.S normspd
MOVE.W D0,RealTempo
MOVEM.L D0-D7/A0-A6,-(SP)
MOVE.W SamScrEnable,-(SP)
ST SamScrEnable
ST UpdateTempo
JSR SetTempo
MOVE.W (SP)+,SamScrEnable
MOVEM.L (SP)+,D0-D7/A0-A6
RTS
normspd CLR.L Counter
MOVE.W D0,CurrSpeed+2
RTS
SpeedNull
CLR.L RunMode
JSR SetNormalPtrCol
RTS
CheckMoreEffects
MOVE.B 2(A6),D0
AND.B #$0F,D0
CMP.B #$9,D0
BEQ SampleOffset
CMP.B #$B,D0
BEQ PositionJump
CMP.B #$D,D0
BEQ PatternBreak
CMP.B #$E,D0
BEQ E_Commands
CMP.B #$F,D0
BEQ SetSpeed
TST.W (A4)
BEQ Return2
CMP.B #$C,D0
BEQ VolumeChange
BRA PerNop
E_Commands
MOVE.B n_cmdlo(A6),D0
AND.B #$F0,D0
LSR.B #4,D0
BEQ FilterOnOff
CMP.B #1,D0
BEQ FinePortaUp
CMP.B #2,D0
BEQ FinePortaDown
CMP.B #3,D0
BEQ SetGlissControl
CMP.B #4,D0
BEQ SetVibratoControl
CMP.B #5,D0
BEQ SetFineTune
CMP.B #6,D0
BEQ JumpLoop
CMP.B #7,D0
BEQ SetTremoloControl
CMP.B #8,D0
BEQ KarplusStrong
CMP.B #$E,D0
BEQ PatternDelay
TST.W (A4)
BEQ Return2
CMP.B #9,D0
BEQ RetrigNote
CMP.B #$A,D0
BEQ VolumeFineUp
CMP.B #$B,D0
BEQ VolumeFineDown
CMP.B #$C,D0
BEQ NoteCut
CMP.B #$D,D0
BEQ NoteDelay
CMP.B #$F,D0
BEQ FunkIt
RTS
FilterOnOff
MOVE.B n_cmdlo(A6),D0
AND.B #1,D0
ASL.B #1,D0
AND.B #$FD,$BFE001
OR.B D0,$BFE001
RTS
SetGlissControl
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
AND.B #$F0,n_glissfunk(A6)
OR.B D0,n_glissfunk(A6)
RTS
SetVibratoControl
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
AND.B #$F0,n_wavecontrol(A6)
OR.B D0,n_wavecontrol(A6)
RTS
SetFineTune
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
MOVE.B D0,n_finetune(A6)
RTS
JumpLoop
TST.L Counter
BNE Return2
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
BEQ SetLoop
TST.B n_loopcount(A6)
BEQ jumpcnt
SUB.B #1,n_loopcount(A6)
BEQ Return2
jmploop MOVE.B n_pattpos(A6),PBreakPosition
ST PBreakFlag
RTS
jumpcnt MOVE.B D0,n_loopcount(A6)
BRA jmploop
SetLoop MOVE.L PatternPosition,D0
LSR.L #4,D0
AND.B #63,D0
MOVE.B D0,n_pattpos(A6)
RTS
SetTremoloControl
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
LSL.B #4,D0
AND.B #$0F,n_wavecontrol(A6)
OR.B D0,n_wavecontrol(A6)
RTS
KarplusStrong
MOVEM.L D1-D2/A0-A1,-(SP)
MOVE.L n_loopstart(A6),A0
MOVE.L A0,A1
MOVE.W n_replen(A6),D0
ADD.W D0,D0
SUBQ.W #2,D0
karplop MOVE.B (A0),D1
EXT.W D1
MOVE.B 1(A0),D2
EXT.W D2
ADD.W D1,D2
ASR.W #1,D2
MOVE.B D2,(A0)+
DBRA D0,karplop
MOVE.B (A0),D1
EXT.W D1
MOVE.B (A1),D2
EXT.W D2
ADD.W D1,D2
ASR.W #1,D2
MOVE.B D2,(A0)
MOVEM.L (SP)+,D1-D2/A0-A1
RTS
RetrigNote
MOVE.L D1,-(SP)
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
BEQ rtnend
MOVE.L Counter,D1
BNE rtnskp
MOVE.W n_note(A6),D1
AND.W #$0FFF,D1
BNE rtnend
MOVE.L Counter,D1
rtnskp DIVU D0,D1
SWAP D1
TST.W D1
BNE rtnend
DoRetrg MOVE.W n_dmabit(A6),$DFF096 ; Channel DMA off
MOVE.L n_start(A6),(A5) ; Set sampledata pointer
MOVE.W n_length(A6),4(A5) ; Set length
MOVE.W n_period(A6),6(A5)
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
; MOVE.W D0,8(A5)
MOVE.W DMAWait,D0
rtnloop1
DBRA D0,rtnloop1
MOVE.W n_dmabit(A6),D0
BSET #15,D0
MOVE.W D0,$DFF096
MOVE.W DMAWait,D0
rtnloop2
DBRA D0,rtnloop2
MOVE.L n_loopstart(A6),(A5)
MOVE.L n_replen(A6),4(A5)
rtnend MOVE.L (SP)+,D1
RTS
VolumeFineUp
TST.L Counter
BNE Return2
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$F,D0
BRA VolSlideUp
VolumeFineDown
TST.L Counter
BNE Return2
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
BRA VolSlideDown2
NoteCut MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
CMP.L Counter,D0
BNE Return2
CLR.B n_volume(A6)
; MOVE.W #0,8(A5)
RTS
NoteDelay
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
CMP.L Counter,D0
BNE Return2
MOVE.W (A6),D0
AND.W #$0FFF,D0
BEQ Return2
MOVE.L D1,-(SP)
BRA DoRetrg
PatternDelay
TST.L Counter
BNE Return2
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
TST.B PattDelayTime2
BNE Return2
ADDQ.B #1,D0
MOVE.B D0,PattDelayTime
RTS
FunkIt TST.L Counter
BNE Return2
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
LSL.B #4,D0
AND.B #$0F,n_glissfunk(A6)
OR.B D0,n_glissfunk(A6)
TST.B D0
BEQ Return2
UpdateFunk
MOVEM.L A0/D1,-(SP)
MOVEQ #0,D0
MOVE.B n_glissfunk(A6),D0
LSR.B #4,D0
BEQ funkend
LEA FunkTable(PC),A0
MOVE.B (A0,D0.W),D0
ADD.B D0,n_funkoffset(A6)
BTST #7,n_funkoffset(A6)
BEQ funkend
CLR.B n_funkoffset(A6)
MOVE.L n_loopstart(A6),D0
MOVEQ #0,D1
MOVE.W n_replen(A6),D1
ADD.L D1,D0
ADD.L D1,D0
MOVE.L n_wavestart(A6),A0
ADDQ.L #1,A0
CMP.L D0,A0
BLO.S funkok
MOVE.L n_loopstart(A6),A0
funkok MOVE.L A0,n_wavestart(A6)
MOVEQ #-1,D0
SUB.B (A0),D0
MOVE.B D0,(A0)
funkend MOVEM.L (SP)+,A0/D1
RTS
;************************* End of Code ******************************
FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
VibratoTable
dc.b 0, 24, 49, 74, 97,120,141,161
dc.b 180,197,212,224,235,244,250,253
dc.b 255,253,250,244,235,224,212,197
dc.b 180,161,141,120, 97, 74, 49, 24
AllRightText dc.b 'All right',0
PLSTFullText dc.b 'Plst is full!',0
AreYouSureText dc.b 'Are you sure?',0
NoDiskInDriveText
dc.b 'No disk in df0!',0
WriteProtectedText
dc.b 'Write protected',0
OprAbortedText dc.b 'Print aborted!',0
EnterDataText dc.b 'Enter data',0
AddingPathText dc.b 'Adding path...',0
DiskErrorText dc.b 'Disk error !!',0
LoadingText dc.b 'Loading...',0
LoadingSongText dc.b 'Loading song',0
LoadingModuleText
dc.b 'Loading module',0
LoadingSampleText
dc.b 'Loading sample',0
SavingText dc.b 'Saving...',0
;SaveSongText dc.b 'Save song ?',0
SavingSongText dc.b 'Saving song',0
;SaveModuleText dc.b 'Save module ?',0
SavingModuleText
dc.b 'Saving module',0
;SaveSampleText dc.b 'Save sample ?',0
SavingSampleText
dc.b 'Saving sample',0
LoadingPLSTText dc.b 'Loading plst',0
SavingPLSTText dc.b 'Saving plst',0
DeletingSongText
dc.b 'Deleting song',0
DeletingModuleText
dc.b 'Deleting module',0
DeletingSampleText
dc.b 'Deleting sample',0
RenamingFileText
dc.b 'Renaming file',0
DecrunchingText dc.b 'Decrunching...',0
CrunchingText dc.b 'Crunching...',0
SelectEntryText dc.b 'Select entry',0
SelectSongText dc.b 'Select song',0
SelectModuleText
dc.b 'Select module',0
SelectSampleText
dc.b 'Select sample',0
SelectFileText dc.b 'Select file',0
ReadingDirText dc.b 'Reading dir...',0
PosSetText dc.b 'Position set',0
PrintingSongText
dc.b 'Printing song',0
PrintingPLSTText
dc.b 'Printing plst',0
SaveSongText dc.b 'Save song ?',0
DeleteSongText dc.b 'Delete song ?',0
SaveModuleText dc.b 'Save module ?',0
DeleteModuleText dc.b 'Delete module ?',0
SaveSampleText dc.b 'Save sample ?',0
DeleteSampleText dc.b 'Delete sample ?',0
PrintPLSTText dc.b 'Print plst ?',0
PrintSongText dc.b 'Print song ?',0
QuitPTText dc.b 'Really quit ?',0
UpsampleText dc.b 'Upsample ?',0
DownSampleText dc.b 'Downsample ?',0
PleaseSelectText dc.b 'Please select',0
ClearSplitText dc.b 'Clear split ?',0
ResetAllText dc.b 'Reset config ?',0
DeletePresetText dc.b 'Delete preset ?',0
LoadPLSTText dc.b 'Load presetlist?',0
SavePLSTText dc.b 'Save presetlist?',0
KillSampleText dc.b 'Kill sample ?',0
AbortLoadText dc.b 'Abort loading ?',0
LoadConfigText dc.b 'Load config ?',0
SaveConfigText dc.b 'Save config ?',0
DiskFormatText dc.b 'Disk format'
InProgressText dc.b 'in progress'
FormattingCylText
dc.b 'Formatting cyl ',0
VerifyingText dc.b 'Verifying cyl ',0
InitDiskText dc.b 'Initializing',0
PlsEntNamText dc.b 'Please enter name'
OfVolumeText dc.b 'of volume: ST-__',0,0
cnop 0,2
DiskNumText1 dc.b '0'
DiskNumText2 dc.b '0 '
PEdDefaultPath dc.b 'df0:',0
dcb.b 47,0
PEdDefaultVol dc.b 'st-'
SndDiskNum0 dc.b '0'
SndDiskNum1 dc.b '1:'
PresetName dc.b ' '
PsetNameText dc.b ' '
dc.b ' '
PsetVolText dc.b ' '
dc.b ' '
PsetLenText dc.b ' '
dc.b ' '
PsetRepeatText dc.b ' '
dc.b ' '
PsetReplenText dc.b ' '
InsertPsetText dc.b 'ST-01: 0 0000 0000 0002'
PsetPLSTtext dc.b 'No. Samplename '
dc.b 'Length Repeat RepLen',$A,$A
PsetPrtNumText dc.b ' : '
PsetPrtNameText dc.b ' '
PsetPrtLenText dc.b ' '
PsetPrtRepeatText dc.b ' '
PsetPrtRepLenText dc.b 10
dc.b 0
SongDumpText
dc.b 9
dc.b 'Protracker Song-Dump -- Made with '
dc.b 'Protracker V1.2A ',$D,$A,$A
dc.b 9
dc.b 'Songname: '
CRLF_Text dc.b 13,10
FF_Text dc.b 12,0
cnop 0,2
PatternNumText dc.b 9,9,9,'Pattern: '
PattNumText1 dc.b '0'
PattNumText2 dc.b '0',$D,$A,$D,$A
PtotText dc.b 9
PattXText1 dc.b "0"
PattXText2 dc.b "0 : "
PpText dc.b " "
Prafs dc.b " 0000 0000 0000 ",$D,$A
PnText2 dc.b " "
cnop 0,2
dc.b 0
PattPosText dc.b '00 : '
PnText dc.b ' ',0
cnop 0,2
FmtSongDirName dc.b 'DF0:songs',0
FmtModuleDirName dc.b 'DF0:modules',0
cnop 0,2
STText1 dc.b 'ST'
STText1Num dc.b '-'
STText1Number dc.b 0,0,':'
STText2 dc.b 'ST'
STText2Num dc.b '-'
STText2Number dc.b 0,0,':'
STText3 dc.b 'ST'
STText3Num dc.b '-'
STText3Number dc.b 0,0,':'
EmptyLineText dc.b ' ',0
FastHexTable dc.b '000102030405060708090A0B0C0D0E0F'
dc.b '101112131415161718191A1B1C1D1E1F'
dc.b '202122232425262728292A2B2C2D2E2F'
dc.b '303132333435363738393A3B3C3D3E3F'
dc.b '404142434445464748494A4B4C4D4E4F'
dc.b '505152535455565758595A5B5C5D5E5F'
dc.b '606162636465666768696A6B6C6D6E6F'
dc.b '707172737475767778797A7B7C7D7E7F'
dc.b '808182838485868788898A8B8C8D8E8F'
dc.b '909192939495969798999A9B9C9D9E9F'
dc.b 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF'
dc.b 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF'
dc.b 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF'
dc.b 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF'
dc.b 'E0E1E2E3E4E5E6E7E8E9EAEBECEdEEEF'
dc.b 'F0F1F2F3F4F5F6F7F8F9FAFBFCFdFEFF'
TrackdiskName dc.b 'trackdisk.device',0
InputDevName dc.b 'input.device',0
DOSbase dc.l 0
IntuitionBase dc.l 0
GfxBase dc.l 0
RawKeyHexTable
dc.b 10,1,2,3,4,5,6,7
dc.b 8,9,32,53,51,34,18,35
RawKeyScaleTable
dc.b 49,33,50,34,51,52,36,53,37,54,38,55,56,40,57
dc.b 41,58,16,2,17,3,18,19,5,20,6,21,7,22,23,9,24,10
dc.b 25,26,12,27,70,70,0
KbdTransTable1
dc.b 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16
dc.b 12,13,14,15,16,17,18,19,20,21,22,23
dc.b 24,25,26,27,28,29,30,31,36,36
KbdTransTable2
dc.b 12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
dc.b 24,25,26,27,28,29,30,31,32,33,34,35
dc.b 36,36,36,36,36,36,36,36,36,36
NoteNames1
dc.b 'C-1 C#1 D-1 D#1 E-1 F-1 F#1 G-1 G#1 A-1 A#1 B-1 '
dc.b 'C-2 C#2 D-2 D#2 E-2 F-2 F#2 G-2 G#2 A-2 A#2 B-2 '
dc.b 'C-3 C#3 D-3 D#3 E-3 F-3 F#3 G-3 G#3 A-3 A#3 B-3 '
SpcNoteText
dc.b '--- '
NoteNames2
dc.b 'C-1 D¡1 D-1 E¡1 E-1 F-1 G¡1 G-1 A¡1 A-1 B¡1 B-1 '
dc.b 'C-2 D¡2 D-2 E¡2 E-2 F-2 G¡2 G-2 A¡2 A-2 B¡2 B-2 '
dc.b 'C-3 D¡3 D-3 E¡3 E-3 F-3 G¡3 G-3 A¡3 A-3 B¡3 B-3 '
dc.b '--- '
PeriodTable
; Tuning 0
dc.w 856,808,762,720,678,640,604,570,538,508,480,453
dc.w 428,404,381,360,339,320,302,285,269,254,240,226
dc.w 214,202,190,180,170,160,151,143,135,127,120,113,0
; Tuning 1
dc.w 850,802,757,715,674,637,601,567,535,505,477,450
dc.w 425,401,379,357,337,318,300,284,268,253,239,225
dc.w 213,201,189,179,169,159,150,142,134,126,119,113,0
; Tuning 2
dc.w 844,796,752,709,670,632,597,563,532,502,474,447
dc.w 422,398,376,355,335,316,298,282,266,251,237,224
dc.w 211,199,188,177,167,158,149,141,133,125,118,112,0
; Tuning 3
dc.w 838,791,746,704,665,628,592,559,528,498,470,444
dc.w 419,395,373,352,332,314,296,280,264,249,235,222
dc.w 209,198,187,176,166,157,148,140,132,125,118,111,0
; Tuning 4
dc.w 832,785,741,699,660,623,588,555,524,495,467,441
dc.w 416,392,370,350,330,312,294,278,262,247,233,220
dc.w 208,196,185,175,165,156,147,139,131,124,117,110,0
; Tuning 5
dc.w 826,779,736,694,655,619,584,551,520,491,463,437
dc.w 413,390,368,347,328,309,292,276,260,245,232,219
dc.w 206,195,184,174,164,155,146,138,130,123,116,109,0
; Tuning 6
dc.w 820,774,730,689,651,614,580,547,516,487,460,434
dc.w 410,387,365,345,325,307,290,274,258,244,230,217
dc.w 205,193,183,172,163,154,145,137,129,122,115,109,0
; Tuning 7
dc.w 814,768,725,684,646,610,575,543,513,484,457,431
dc.w 407,384,363,342,323,305,288,272,256,242,228,216
dc.w 204,192,181,171,161,152,144,136,128,121,114,108,0
; Tuning -8
dc.w 907,856,808,762,720,678,640,604,570,538,508,480
dc.w 453,428,404,381,360,339,320,302,285,269,254,240
dc.w 226,214,202,190,180,170,160,151,143,135,127,120,0
; Tuning -7
dc.w 900,850,802,757,715,675,636,601,567,535,505,477
dc.w 450,425,401,379,357,337,318,300,284,268,253,238
dc.w 225,212,200,189,179,169,159,150,142,134,126,119,0
; Tuning -6
dc.w 894,844,796,752,709,670,632,597,563,532,502,474
dc.w 447,422,398,376,355,335,316,298,282,266,251,237
dc.w 223,211,199,188,177,167,158,149,141,133,125,118,0
; Tuning -5
dc.w 887,838,791,746,704,665,628,592,559,528,498,470
dc.w 444,419,395,373,352,332,314,296,280,264,249,235
dc.w 222,209,198,187,176,166,157,148,140,132,125,118,0
; Tuning -4
dc.w 881,832,785,741,699,660,623,588,555,524,494,467
dc.w 441,416,392,370,350,330,312,294,278,262,247,233
dc.w 220,208,196,185,175,165,156,147,139,131,123,117,0
; Tuning -3
dc.w 875,826,779,736,694,655,619,584,551,520,491,463
dc.w 437,413,390,368,347,328,309,292,276,260,245,232
dc.w 219,206,195,184,174,164,155,146,138,130,123,116,0
; Tuning -2
dc.w 868,820,774,730,689,651,614,580,547,516,487,460
dc.w 434,410,387,365,345,325,307,290,274,258,244,230
dc.w 217,205,193,183,172,163,154,145,137,129,122,115,0
; Tuning -1
dc.w 862,814,768,725,684,646,610,575,543,513,484,457
dc.w 431,407,384,363,342,323,305,288,272,256,242,228
dc.w 216,203,192,181,171,161,152,144,136,128,121,114,0
CursorPosTable
dc.b 3,6,7,8,9,10,12
dc.b 15,16,17,18,19,21
dc.b 24,25,26,27,28,30
dc.b 33,34,35,36,37
UnshiftedKeymap
dc.b '`1234567890-=\*0'
dc.b 'qwertyuiop[]*123'
dc.b 'asdfghjkl;',39,'#',0,'456'
dc.b '<zxcvbnm,./',0,'.','789 '
ShiftedKeymap
dc.b '~!@#$%^&*()_+|*0'
dc.b 'qwertyuiop{}*123'
dc.b 'asdfghjkl:',34,'^',0,'456'
dc.b '>zxcvbnm<>?',0,'.','789 '
SongNumOfPatt dc.w 1
NoteNamesPtr dc.l 0
SpritePtrsPtr dc.l 0
LineCurPosPtr dc.l 0
NoSpritePtr dc.l 0
CursorPosPtr dc.l 0
Ch1SpritePtr dc.l 0
Ch2SpritePtr dc.l 0
Ch3SpritePtr dc.l 0
Ch4SpritePtr dc.l 0
PPattPos dc.l 0
SaveEditMode dc.l 0
EditMode dc.l 0
RunMode dc.l 0
CurrCmds dc.l 0
TextBplPtr dc.l 0
TextOffset dc.w 0
TextLength dc.w 0
TextLenTemp dc.l 0
ShowTextPtr dc.l 0
PatternNumber dc.l 0
CurrPos dc.l 0
CurrSpeed dc.l 0
KeyTransTabPtr dc.l 0
CmdOffset dc.w 0
RawKeyCode dc.b 0
PattRfsh dc.b 0
MountFlag dc.w 0
GetlineFlag dc.w 0
LoadInProgress dc.w 0
KbIntSave dc.l 0
KbIntSavePtr dc.l 0
CurrentPlayNote dc.w 214
LineCurX dc.w 0
LineCurY dc.w 0
TextEndPtr dc.l 0
ScrPattPos dc.w 0
PattCurPos dc.w 0
GadgRepeat dc.w 0
WordNumber dc.w 0
HighPattNum dc.w 0
InsNum dc.w 0
LastInsNum dc.w 1
PlayInsNum dc.w 1
HiLowInstr dc.w 0
PEDpos dc.w 0
PLSTpos dc.w 0
MaxPLSTOffset dc.l 0
PresetMarkTotal dc.w 0
PLSTOffset dcb.b 14*4,0
CurrentPreset dc.w 1
UpOrDown dc.w 0
Joy0Low dc.w 0
Joy0High dc.w 0
MouseX dc.w 0
MouseY dc.w 0
MouseX2 dc.w 0
MouseY2 dc.w 0
MouseX3 dc.w 0
MouseY3 dc.w 0
DecompMemPtr dc.l 0
DecompMemSize dc.l 0
SampleInfo dc.w 0
si_volume dc.w 0
si_long dc.l 0
si_pointer dc.l 0,0,0,0,0
SampleInfo2 dc.w 0
si_volume2 dc.w 0
si_long2 dc.l 0
si_pointer2 dc.l 0,0,0,0,0
LongFFFF dc.l 0
PosJumpAssert dc.b 0
PBreakPosition dc.b 0
PBreakFlag dc.b 0
LEDStatus dc.b 0
PattDelayTime dc.b 0
PattDelayTime2 dc.b 0
PattRfshNum dc.l 0
DidQuantize dc.w 0
MessagePtr dc.l 0
FileNamePtr dc.l 0
DiskDataPtr dc.l 0
FileHandle dc.l 0
DiskDataLength dc.l 0
LowMask dc.b $FF
PatternPosition dc.l 0
SongPosition dc.l 0
Counter dc.l 0
PatternPtr dc.l 0
SongDataPtr dc.l 0
SampleStarts dcb.l 31,0
SamplePtrs EQU SampleStarts-4
SampleLengths dcb.l 32,0
DMACONtemp dc.w 0
StackSave dc.l 0
InputDevMouse dc.l 0,0,0
AnalyzerHeights dcb.w 23,0
AnalyzerOpplegg dcb.w 23,0
Action dc.w 0
PathPtr dc.l 0
FileLock dc.l 0
CurrScreen dc.w 0
SaveCurrScreen dc.w 0
PointerCol1Save dc.w 0
PointerCol2Save dc.w 0
PointerCol3Save dc.w 0
GetDecTemp dc.b 0
UpdateTempo dc.b 0
MoreInstrFlag dc.w 0
SampleSortList dcb.l 32,0
PLSTmem dc.l 0
PresetTotal dc.w 0
SaveScope dc.b 0
dc.b 0 ;free 0
DisableAnalyzer dc.b 0
SaveDA dc.b 0
AutoReqRunning dc.b 0
NoSampleInfo dc.b 0
FormatDataPtr dc.l 0
CylinderNumber dc.w 0
TrackdiskPort dc.l 0,0,0,0
ProcessPtr dc.l 0,0,0,0
DateStamp dc.l 0,0,0,0
EnterTextFlag dc.w 0
PresetLength dc.w 0
PresetFineTune dc.w 0
PresetRepeat dc.w 0
PresetReplen dc.w 0
PED_Action dc.w 0
PsetNumTemp dc.w 0
PsetPtrTemp dc.l 0
FreeDiskSpace dc.l 0
SplitAddress dc.l 0
LaHeTx dc.l $12345678
PLSTallocsize dc.l 0
MaxPLSTEntries2 dc.w 0
;---- Setup Data ----
DefaultSetupData
dc.b 'PT1.2 Configuration File',$A,0
dc.b 'ST-00:songs'
dcb.b 21,0
dc.b 'ST-00:modules'
dcb.b 19,0
dc.b 'DF0:'
dcb.b 28,0
dc.b 'PRT:'
dcb.b 28,0
DefCol dc.w $000,$BBB,$888,$555,$FD0,$D04,$000,$34F
dc.b 1 ; Song Pack Mode
dc.b 0 ; Module Pack Mode
dc.b 0 ; Split 0=off, 1=on
dc.b 0 ; Filter
dc.b 0 ; TransDel
dc.b 1 ; ShowDec
dc.b 1 ; AutoDir
dc.b 1 ; AutoExit
dc.b 1 ; ModOnly
dc.b 0 ; MIDI
dc.b 1,$18,$18,0 ; SplitData
dc.b 2,$1A,$18,0
dc.b 3,$1C,$18,0
dc.b 4,$1D,$18,0
dc.w 20,2 ; KeyRepDelay/Speed
dc.b 0 ; Accidental
dc.b 0 ; not in use
dc.b 'newshell',0 ; ExtCmd 0
dcb.b 23,0
dc.b 'add21k',0 ; ExtCmd 1
dcb.b 25,0
dc.b 'info',0 ; ExtCmd 2
dcb.b 27,0
dc.b 'list',0 ; ExtCmd 3
dcb.b 27,0
dc.b 'loadwb -debug',0 ; ExtCmd 4
dcb.b 18,0
dc.b 'diskmaster1.3',0 ; ExtCmd 5
dcb.b 18,0
dc.b 'run AudioMasterIII',0 ; ExtCmd 6
dcb.b 13,0
dc.b 'ced',0 ; ExtCmd 7
dcb.b 28,0
dc.w 0 ; Not in use
dc.w 2500 ; Max PLST Entries
dc.b 2,3,4,1 ; Multi Mode Next
dc.w $102,$202,$037,$047,$304, $F06,$C10,$C20,$E93,$A0F
dc.b 0 ; RAW/IFF Save, 0=RAW, 1=IFF
dc.b 1 ; IntMode, 0=VBLANK, 1=CIA
dc.b 0 ; Override
dc.b 0 ; Nosamples
dc.b 0 ; BlankZero
dc.b 1 ; ShowDirs
dc.b 0 ; CutToBuf
dc.b 0 ; ShowPublic
dc.b 1 ; IFFLoop
dc.b 0 ; HHFlag
dc.w 125 ; Tempo
dc.w 300 ; DMAWait
dc.w 24 ; TuneNote (C-3)
dc.w $20 ; TToneVol
dc.b 0,0,0,0,0,0,0,0 ; (Pad to 512 bytes)
dc.b "ST-00:" ; Protracker Path
dcb.b 26
dc.w 6 ; DefaultSpeed
dc.w $0F00,$0F00,$0F10,$0F10,$0F20,$0F20,$0F30,$0F30 ; VU-Meter
dc.w $0F40,$0F50,$0F60,$0F70,$0F80,$0F90,$0FA0,$0FB0 ; colors
dc.w $0FC0,$0FD0,$0FE0,$0FF0,$0FF0,$0EF0,$0EF0,$0DF0
dc.w $0DF0,$0CF0,$0CF0,$0BF0,$0BF0,$0AF0,$09F0,$09F0
dc.w $08F0,$08F0,$07F0,$07F0,$06F0,$06F0,$05F0,$05F0
dc.w $04F0,$04F0,$03F0,$03F0,$02F0,$01F0,$00F0,$00E0
dc.w $0F00,$0F10,$0F20,$0F30,$0F40,$0F50,$0F60,$0F70 ; Analyzer
dc.w $0F80,$0F90,$0FA0,$0FB0,$0FC0,$0FD0,$0FE0,$0FF0 ; colors
dc.w $0EF0,$0DF0,$0CF0,$0BF0,$0AF0,$09F0,$08F0,$07F0
dc.w $06F0,$05F0,$04F0,$03F0,$02F0,$01F0,$00F0,$00E0
dc.w $00D0,$00C0,$00B0,$00A0,$0090,$0080,$0070,$0060
dcb.b 302 ; Pad to 1024 bytes
;---- Sampler routines ----
_custom EQU $00DFF000
intreq EQU $0000009C
intreqr EQU $0000001E
intena EQU $0000009A
joy0dat EQU $0000000A
vhposr EQU $00000006
dmacon EQU $00000096
dmaconr EQU $00000002
SamInfoPtr dc.l 0
SamInfoLen dc.l 0
SampleNote dc.w 24 ; C-3
ResampleNote dc.w 24 ; C-3
SamIntSave dc.w 0
SamDMASave dc.w 0
ClearTempSampArea
LEA TempSampArea,A0
MOVE.W #379,D0
MOVEQ #0,D1
ctsalop MOVE.W D1,(A0)+
DBRA D0,ctsalop
RTS
Sampler CLR.B RawKeyCode
JSR StopIt
JSR TopExit
JSR WaitForButtonUp
JSR SetWaitPtrCol
BSR ShowMon
JSR Wait_4000
JSR ClearRightArea
JSR ClearAnalyzerColors
BSR ClearTempSampArea
BSR WaitForDiskDrive
MOVE.W $DFF01C,SamIntSave ; intenar
MOVE.W #$7FFF,_custom+intena
JSR TurnOffVoices
MOVE.W SampleNote,D0
ASL.W #1,D0
LEA PeriodTable,A0
MOVE.W (A0,D0.W),D0
LSR.W #1,D0
LEA $00DFF000,A0
LEA $AA(A0),A5
LEA $BA(A0),A6
MOVE.W D0,$A6(A0)
MOVE.W D0,$B6(A0)
MOVEQ.L #$20,D0
MOVE.W D0,$A8(A0)
MOVE.W D0,$B8(A0)
MOVEQ.L #0,D0
MOVE.W D0,(A5)
MOVE.W D0,(A6)
MOVE.B #6,$00BFD200
MOVEQ.L #2,D0
MOVE.B D0,$00BFD000
MOVE.B #0,$00BFE301
LEA GraphOffsets(PC),A0
LEA TempSampArea,A1
MOVE.L TextBplPtr,A2
LEA $09E8-40(A2),A2
LEA $00BFE101,A3
LEA _custom+intreqr,A4
MOVE.W #$0180,D7
MOVEQ.L #6,D6
MOVEQ.L #10,D3
monilop2
MOVEQ.L #22,D5
monilop4
MOVEQ.L #7,D4
monilop3
BTST D7,(A4)
BEQ.S monilop3
MOVE.W D7,$7E(A4)
MOVEQ.L #0,D0
MOVE.B (A3),D0
MOVE.W D0,D1
SUB.B D7,D0
MOVE.B D0,(A5)
MOVE.B D0,(A6)
LSR.W #3,D1
ADD.W D1,D1
MOVE.W 0(A0,D1.W),D0
MOVE.W (A1),D1
MOVE.W D0,(A1)+
BCLR D4,0(A2,D1.W)
BSET D4,0(A2,D0.W)
DBRA D4,monilop3
ADDQ.L #1,A2
DBRA D5,monilop4
SUB.L #23,A2
SUB.L #368,A1
BTST D6,-$0100(A3)
BEQ sampexit
BTST D3,-8(A4)
BNE.S monilop2
;-- start sampling --
MOVE.W InsNum(PC),D1
BEQ sampexit
LSL.W #2,D1
LEA SamplePtrs,A0
MOVE.L (A0,D1.W),D0
BEQ.S samaok
CLR.L (A0,D1.W)
MOVE.L D0,A1
MOVE.L 124(A0,D1.W),D0
BEQ.S samaok
CLR.L 124(A0,D1.W)
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
samaok MOVE.L #$FFFE,D6 ; try 64k
samalclop
MOVE.L D6,D0
MOVE.L #MEMF_CHIP!MEMF_CLEAR,D1
MOVE.L 4.W,A6
JSR LVOAllocMem(A6)
TST.L D0
BNE.S samalcok
SUB.L #2048,D6 ; try 2k less
BPL.S samalclop
BSR OutOfMemErr
BRA sampexit
samalcok
MOVE.W InsNum(PC),D1
LSL.W #2,D1
LEA SamplePtrs(PC),A0
MOVE.L D0,(A0,D1.W)
MOVE.L D6,124(A0,D1.W)
MOVE.W $DFF002,SamDMASave
MOVE.W #$03FF,_custom+dmacon
BSR GetSampleInfo
MOVE.L SamInfoLen,D4
CLR.W $DFF100
CLR.W $DFF180
MOVE.L SamInfoPtr,A1
LEA _custom+intreq,A2
LEA $00BFE101,A3 ; parallel port
LEA _custom+intreqr,A4
LEA $DFF0BA,A6
MOVE.W #$0180,D7
MOVEQ.L #6,D6
MOVEQ.L #0,D5
samploop
BTST D7,(A4)
BEQ.S samploop
MOVE.W D7,(A2)
MOVE.B (A3),D0
SUB.B D7,D0
MOVE.B D0,(A5)
MOVE.B D0,(A6)
MOVE.B D0,(A1)+
ADDQ.W #1,D5
CMP.W D4,D5
BEQ.S sampend
BTST D6,-$0100(A3)
BNE.S samploop
sampend MOVE.W SamDMASave,D0
OR.W #$8000,D0
MOVE.W D0,$00DFF096
MOVE.L A1,D0
SUB.L SamInfoPtr(PC),D0
MOVE.L D0,SamInfoLen
MOVE.L SongDataPtr(PC),A0
MOVE.W InsNum(PC),D1
MULU #30,D1
LEA 12(A0,D1.W),A0
MOVE.L SamInfoLen(PC),D0
LSR.L #1,D0
MOVE.W D0,(A0)+
MOVE.W #$0040,(A0)+
CLR.W (A0)+
MOVE.W #1,(A0)
MOVE.L SamInfoLen(PC),D1
NEG.L D1
AND.L #$FFFFFFF8,D1
NEG.L D1
MOVE.W InsNum(PC),D0
ASL.W #2,D0
LEA SamplePtrs,A0
CMP.L 124(A0,D0.W),D1
BGE.S sampexit
MOVE.L 124(A0,D0.W),D2
MOVE.L D1,124(A0,D0.W)
SUB.L D1,D2
MOVE.L 0(A0,D0.W),A1
MOVE.L 124(A0,D0.W),D0
ADD.L D0,A1
MOVE.L D2,D0
MOVE.L 4.W,A6
JSR LVOFreeMem(A6)
sampexit
MOVE.W SamIntSave,D0
BSET #15,D0
MOVE.W D0,$DFF09A
JSR TurnOffVoices
JSR DisplayMainScreen
BSR ClearSamStarts
BSR ShowSampleInfo
BSR RedrawSample
JSR WaitForButtonUp
CLR.W KeyBufPos
CLR.B RawKeyCode
CLR.W ShiftKeyStatus
JMP Wait_4000
SampleNullInfo
CLR.L SamInfoPtr
CLR.L SamInfoLen
MOVEQ #-1,D0
RTS
GetSampleInfo
MOVE.W InsNum(PC),D0
BEQ.S SampleNullInfo
LSL.W #2,D0
LEA SamplePtrs(PC),A0
MOVE.L (A0,D0.W),SamInfoPtr
MOVE.L 124(A0,D0.W),SamInfoLen
MOVEQ #0,D0
RTS
ShowMon SF ScopeEnable
ST DisableAnalyzer
JSR ClearRightArea
LEA MonitorData,A0
MOVE.L #MonitorSize,D0
MOVEQ #-1,D4
JMP cgjojo
WaitForDiskDrive
JSR StorePtrCol
MOVE.L 4.W,A6
LEA $15E(A6),A0 ; DeviceList
LEA TrackdiskName,A1 ; trackdisk.device
JSR LVOFindName(A6)
MOVE.L D0,A6
LEA $24(A6),A6 ; dn_GlobalVec
trdloop2
MOVE.L A6,A1
MOVEQ.L #3,D6
tdrloop TST.L (A1)+
BEQ.S tdrskip
MOVE.L -4(A1),A2
BTST #7,$0041(A2)
BEQ.S tdrnotset
tdrskip DBRA D6,tdrloop
JMP RestorePtrCol
tdrnotset
JSR SetDiskPtrCol
BRA.S trdloop2
ClearSamStarts
LEA SamplePtrs+4,A0
MOVEQ #30,D0
cssLoop MOVE.L (A0)+,D1
BEQ cssSkip
MOVE.L D1,A1
CLR.W (A1)
cssSkip DBRA D0,cssLoop
RTS
GraphOffsets
dc.w 31*40,30*40,29*40,28*40,27*40,26*40,25*40,24*40
dc.w 23*40,22*40,21*40,20*40,19*40,18*40,17*40,16*40
dc.w 15*40,14*40,13*40,12*40,11*40,10*40,09*40,08*40
dc.w 07*40,06*40,05*40,04*40,03*40,02*40,01*40,00*40
SamNoteType dc.w 0
ShowSamNote
TST.W SamScrEnable
BEQ Return2
MOVE.L NoteNamesPtr,A4
MOVE.W #237*40+36,TextOffset
MOVE.W SampleNote,D0
LSL.W #2,D0
LEA (A4,D0.W),A0
MOVE.L A0,ShowTextPtr
MOVE.W #4,TextLength
BRA ShowText
ShowResamNote
TST.W SamScrEnable
BEQ Return2
MOVE.L NoteNamesPtr,A4
MOVE.W #248*40+36,TextOffset
MOVE.W ResampleNote,D0
LSL.W #2,D0
LEA (A4,D0.W),A0
MOVE.L A0,ShowTextPtr
MOVE.W #4,TextLength
BRA ShowText
;---- Graphics Data ----
FontSize = 568
SpectrumAnaSize = 808
ScopeSize = 1814
SureBoxSize = 1100
ClearBoxSize = 1100
FormatBoxSize = 1412
DirScreenSize = 2861
PLSTSize = 1728-8
Edit1Size = 1748
Edit2Size = 1902
Edit3Size = 2145
SetupScreenSize = 5468
Setup2Size = 5074
PresetEdSize = 5161
SampScreenSize = 3843
MonitorSize = 817
HelpScreenSize = 900
INCDIR "df0:"
FontData INCBIN "raw/ptfont.raw"
cnop 0,2
SpectrumAnaData INCBIN "pak/ptspectrumana.pak"
cnop 0,2
ScopeData INCBIN "pak/ptscope.pak"
cnop 0,2
SureBoxData INCBIN "raw/ptsurebox.raw"
cnop 0,2
ClearBoxData INCBIN "raw/ptclearbox.raw"
cnop 0,2
FormatBoxData INCBIN "raw/ptformatbox.raw"
cnop 0,2
DirScreenData INCBIN "pak/ptfilereq.pak"
cnop 0,2
PLSTData INCBIN "pak/ptplst.pak"
cnop 0,2
Edit1Data INCBIN "pak/ptedit1.pak"
cnop 0,2
Edit2Data INCBIN "pak/ptedit2.pak"
cnop 0,2
Edit3Data INCBIN "pak/ptedit3.pak"
cnop 0,2
SetupScreenData INCBIN "pak/ptsetup.pak"
cnop 0,2
Setup2Data INCBIN "pak/ptsetup2.pak"
cnop 0,2
PresetEdData INCBIN "pak/ptpreseted.pak"
cnop 0,2
SampScreenData INCBIN "pak/ptsampler.pak"
cnop 0,2
MonitorData INCBIN "pak/ptmonitor.pak"
cnop 0,2
HelpScreenData INCBIN "pak/pthelpscreen.pak"
cnop 0,2
VolBoxData INCBIN "raw/ptvolbox.raw"
ToggleONdata INCBIN "raw/PTToggleON.raw"
ToggleOFFdata INCBIN "raw/PTToggleOFF.raw"
S_BoxData INCBIN "raw/PTLetters.raw"
A_BoxData EQU S_BoxData+22
T_BoxData EQU S_BoxData+44
P_BoxData EQU S_BoxData+66
H_BoxData EQU S_BoxData+88
C_BoxData EQU S_BoxData+110
;************************** CHIP DATA HUNK **************************
SECTION ptdata,DATA_C
BitplaneData INCBIN "raw/PTMainScreen.raw"
TopMenusPos EQU BitPlaneData+55
SpectrumAnaPos EQU BitPlaneData+1815
FormatBoxPos EQU BitPlaneData+2090
SureBoxPos EQU BitPlaneData+2100
SamScrPos EQU BitPlaneData+4880
VolBoxPos EQU BitPlaneData+6209
TToneData ; Tuning Tone (Sine Wave)
dc.b 0, 25, 49, 71, 91, 106, 118, 126
dc.b 127, 126, 118, 106, 91, 71, 49, 25
dc.b 0, -25, -49, -71, -91,-106,-118,-126
dc.b -127,-126,-118,-106, -91, -71, -49, -25
CopList dc.w $0120 ; Sprite 0 high
dc.w 0
dc.w $0122 ; Sprite 0 low
dc.w 0
dc.w $0124 ; Sprite 1 high
dc.w 0
dc.w $0126 ; Sprite 1 low
dc.w 0
dc.w $0128 ; Sprite 2 high
dc.w 0
dc.w $012A ; Sprite 2 low
dc.w 0
dc.w $012C ; Sprite 3 high
dc.w 0
dc.w $012E ; Sprite 3 low
dc.w 0
dc.w $0130 ; Sprite 4 high
dc.w 0
dc.w $0132 ; Sprite 4 low
dc.w 0
dc.w $0134 ; Sprite 5 high
dc.w 0
dc.w $0136 ; Sprite 5 low
dc.w 0
dc.w $0138 ; Sprite 6 high
dc.w 0
dc.w $013A ; Sprite 6 low
dc.w 0
dc.w $013C ; Sprite 7 high
dc.w 0
dc.w $013E ; Sprite 7 low
dc.w 0
CopListBitplanes
dc.w $00E0 ; Bitplane 0 high
dc.w 0
dc.w $00E2 ; Bitplane 0 low
dc.w 0
dc.w $00E4 ; Bitplane 1 high
dc.w 0
dc.w $00E6 ; Bitplane 1 low
dc.w 0
dc.w $00E8 ; Bitplane 2 high
NoteBplptrHigh
dc.w 0
dc.w $00EA ; Bitplane 2 low
NoteBplptrLow
dc.w 0
CopListColors
dc.w $01A2 ; Color 17
dc.w $0AAA
dc.w $01A4 ; Color 18
dc.w $0888
dc.w $01A6 ; Color 19
dc.w $0666
dc.w $01A0 ; Color 16
dc.w 0
dc.w $0180 ; Color 0
CopCol0 dc.w 0
dc.w $0182 ; Color 1
dc.w $0AAA
dc.w $0184 ; Color 2
dc.w $0777
dc.w $0186 ; Color 3
dc.w $0444
dc.w $0188 ; Color 4
dc.w $0CCC
dc.w $018A ; Color 5
dc.w $0A00
dc.w $018C ; Color 6
dc.w $0000
dc.w $018E ; Color 7
dc.w $004D
dc.w $01AE ; Color 23
dc.w $0A00
dc.w $01AA ; Color 21
dc.w $0700
dc.w $01AC ; Color 22
dc.w $0400
dc.w $008E ; Display Window Start
dc.w $2C81 ; 2C / 81
dc.w $0090 ; Display Window Stop
dc.w $2CC1 ; 2C / C1
dc.w $0092 ; Display Data Fetch Start
dc.w $0038
dc.w $0094 ; Display Data Fetch Stop
dc.w $00D0
dc.w $0108
dc.w 0
dc.w $010A
dc.w 0
dc.w $0102 ; bplcon1
dc.w 0
dc.w $0104 ; bplcon2
dc.w $0024
dc.w $2C07 ; Wait for line $2C, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $3200
CopListAnalyzer
dcb.w 320,0
CopListInsPos
dc.w $B807 ; Wait for line $88, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $2200
CopListBpl4
dc.w $00E8 ; Bitplane 4 high
dc.w 0
dc.w $00EA ; Bitplane 4 low
dc.w 0
dc.w $0188 ; Color 4
NoteCol dc.w $004D
dc.w $B907 ; Wait for line $89, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $3200
CopListMark2
dcb.w 672,0
dc.w $E907 ; Wait for line $E9, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w $FFD8
dc.w $0108 ; bpl1mod
dc.w $FFD8
dc.w $EA07 ; Wait for line $EA, pos $07
dc.w $FFFE
dc.w $0104 ; bplcon2
dc.w $0010
dc.w $010A ; bpl2mod
dc.w 0
dc.w $0108 ; bpl1mod
dc.w 0
dc.w $EB07 ; Wait for line $E8, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w $FFD8
dc.w $0108 ; bpl1mod
dc.w $FFD8
dc.w $EC07 ; Wait for line $EC, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w 0
dc.w $0108 ; bpl1mod
dc.w 0
dc.w $ED07 ; Wait for line $ED, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w $FFD8
dc.w $0108 ; bpl1mod
dc.w $FFD8
dc.w $EE07 ; Wait for line $EE, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w 0
dc.w $0108 ; bpl1mod
dc.w 0
dc.w $EF07 ; Wait for line $EF, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w $FFD8
dc.w $0108 ; bpl1mod
dc.w $FFD8
dc.w $F007 ; Wait for line $F0, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w 0
dc.w $0108 ; bpl1mod
dc.w 0
dc.w $F107 ; Wait for line $F1, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w $FFD8
dc.w $0108 ; bpl1mod
dc.w $FFD8
dc.w $F207 ; Wait for line $F2, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w 0
dc.w $0108 ; bpl1mod
dc.w 0
dc.w $F307 ; Wait for line $F3, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w $FFD8
dc.w $0108 ; bpl1mod
dc.w $FFD8
dc.w $F407 ; Wait for line $F4, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w 0
dc.w $0108 ; bpl1mod
dc.w 0
dc.w $F507 ; Wait for line $F5, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w $FFD8
dc.w $0108 ; bpl1mod
dc.w $FFD8
dc.w $F607 ; Wait for line $F6, pos $07
dc.w $FFFE
dc.w $010A ; bpl2mod
dc.w 0
dc.w $0108 ; bpl1mod
dc.w 0
dc.w $01B2 ; Color 1
dc.w 0
dc.w $01B4 ; Color 2
dc.w 0
dc.w $01B6 ; Color 3
dc.w 0
dc.w $01BA ; Color 5
dc.w 0
dc.w $01BC ; Color 6
dc.w 0
dc.w $01BE ; Color 7
dc.w 0
dc.w $FFDF ; Wait for line $FF, pos $DF
dc.w $FFFE
dc.w $2907 ; Wait for line $29, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $2200
dc.w $2C07 ; Wait for line $2C, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $0200
dc.w $FFFF ; Wait for line $FF, pos $FF
dc.w $FFFE ; End of copperlist
CopList2
dc.w $B607 ; Wait for line $B6, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $2200
CopList2Bpl4Ptr
dc.w $00E8 ; Bitplane 4 high
dc.w 0
dc.w $00EA ; Bitplane 4 low
dc.w 0
dc.w $0188 ; Color 4
dc.w $004D
dc.w $01B2 ; LoopSprite color
dc.w $00F0
dc.w $01BA ; PlayPos Sprite color
dc.w $00FF
dc.w $B707 ; Wait for line $B7, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $3200
dc.w $FFDF ; Wait for line $FF, pos $DF
dc.w $FFFE
dc.w $2907 ; Wait for line $29, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $2200
dc.w $2C07 ; Wait for line $2C, pos $07
dc.w $FFFE
dc.w $0100 ; bplcon0
dc.w $0200
dc.w $FFFF ; Wait for line $FF, pos $FF
dc.w $FFFE ; End of copperlist
PointerSpriteData
dc.w 0,0
dc.w $FFFF,$FFFF,$8002,$FFFE,$BFF4,$C00C,$BFE8,$C018
dc.w $BFD0,$C030,$BFE8,$C018,$BFF4,$C00C,$BFFA,$C006
dc.w $BFFD,$C003,$BFFA,$C006,$B7F4,$C80C,$ABE8,$DC18
dc.w $95D0,$F630,$A2A0,$E360,$C140,$C1C0,$8080,$8080
NoSpriteData
dc.w 0,0,0,0
CursorSpriteData
dc.w 0,0
dc.w $FFE0,$FFE0,$FFE0,$FFE0,$8020,$0000,$8020,$0000
dc.w $8020,$0000,$8020,$0000,$8020,$0000,$8020,$0000
dc.w $8020,$0000,$8020,$0000,$8020,$0000,$8020,$0000
dc.w $0000,$FFE0,$0000,$FFE0
dc.w 0,0
LineCurSpriteData
dc.w 0,0,$0000,$FE00,$0000,$FE00,$0000,$0000,0,0
VUSpriteData1
dc.w $E95B,$EA01
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w 0,0
VUSpriteData2
dc.w $E97F,$EA01
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w 0,0
VUSpriteData3
dc.w $E9A3,$EA01
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w 0,0
VUSpriteData4
dc.w $E9C7,$EA01
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w $C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0,$C0C0,$3FC0
dc.w 0,0
LoopSpriteData1
dc.w 0,0
dc.w $F000,0,$F000,0,$F000,0,$F000,0,$1000,0,$1000,0,$1000,0,$1000,0
dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0
dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0
dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$7000,0
dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0
dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0
dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0
dc.w $1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0,$1000,0
dc.w 0,0
LoopSpriteData2
dc.w 0,0
dc.w $F000,0,$F000,0,$F000,0,$F000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$E000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w 0,0
PlayPosSpriteData
dc.w 0,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w $8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0,$8000,0
dc.w 0,0
;******** BSS HUNK ********
SECTION ptbss,BSS
FileInfoBlock ds.b 256 ;,0
FIB_EntryType EQU FileInfoBlock+4
FIB_FileName EQU FileInfoBlock+8
FIB_FileSize EQU FileInfoBlock+124
FIB_DateStamp EQU FileInfoBlock+132
InfoData ds.b 36
TopMenusBuffer ds.b 2200
TextDataBuffer ds.b 546
TrackBuffer ds.b 256
CmdsBuffer ds.b 256
BlockBuffer ds.b 256
PatternBuffer ds.b 1024
UndoBuffer ds.b 1024
TrackdiskIOExtTD
ds.w 1
ds.l 3
TDPortPtr ds.l 1
ds.w 1
Fmt_tja ds.w 1
ds.l 2
ds.b 3
Fmt_hmmm ds.b 1
ds.w 1
FmtDataSize ds.w 2
FmtDataPtr ds.w 2
FmtDiskOffset ds.l 9
SplitTransTable ds.b 38
SplitInstrTable ds.b 38
ModulesPath2 ds.b 64
SongsPath2 ds.b 64
SamplePath2 ds.b 64
ds.l 1
SetupData ds.b 26
SongsPath ds.b 32
ModulesPath ds.b 32
SamplePath ds.b 32
PrintPath ds.b 32
ColorTable ds.w 8
PackMode ds.b 1
ModPackMode ds.b 1
SplitFlag ds.b 1
FilterFlag ds.b 1
TransDelFlag ds.b 1
ShowDecFlag ds.b 1
AutoDirFlag ds.b 1
AutoExitFlag ds.b 1
ModOnlyFlag ds.b 1
MIDIFlag ds.b 1
SplitData ds.b 4
ds.b 4
ds.b 4
ds.b 4
KeyRepDelay ds.w 1
KeyRepSpeed ds.w 1
Accidental ds.b 1
ds.b 1
ExtCommands ds.b 32*8 ; 256 bytes
MaxDirEntries ds.w 1
MaxPLSTEntries ds.w 1
MultiModeNext ds.b 4
EffectMacros ds.w 10
RAWIFFMode ds.b 1
IntMode ds.b 1
OverrideFlag ds.b 1
NosamplesFlag ds.b 1
BlankZeroFlag ds.b 1
ShowDirsFlag ds.b 1
ShowPublicFlag ds.b 1
CutToBufFlag ds.b 1
IFFLoopFlag ds.b 1
HHFlag ds.b 1
Tempo ds.w 1
DMAWait ds.w 1
TuneNote ds.w 1
TToneVol ds.w 1
SalvageAddress ds.b 8
PTPath ds.b 32 ; 512 bytes
DefaultSpeed ds.w 1
VUmeterColors ds.w 48
AnalyzerColors ds.w 40
ds.b 302 ; Pad to 1024 bytes
HelpTextIndex ds.l 256
HelpTextData ds.b 656
InpEvPort ds.b 34
InpEvIOReq ds.b 48
ScopeInfo ds.b 20*4
ScopeSamInfo ds.b 16*31
BlankSample ds.b 320
FileName ds.b 96
NewFileName ds.b 96
SampleFileName ds.b 28
PresetNameText ds.b 22
DirInputName ds.b 30
NewInputName ds.b 30
TempSampArea ds.w 380
SaveColors ds.w 40+48
END
; /* End of File */